hadoop完全分布式(docker的host模式)1、准备内容 1) 四台centos7虚拟机及四个IP地址
2) 技能准备:会linux命令、会docker命令
3) 更改hadoop的6个配置文件
4) 准备dockerfile镜像文件及相应安装的软件docker、JDK、hadoop【hadoop镜像准备(主机)】
5) 说明docker的hosts模式是指容器与主机共用同一个IP地址 注意以下如果章节后面有加(主机)表示在主机上进行操作,章节后面有加(容器)表示在容器上进行操作 2、网络拓扑1) 操作系统版本:centos 7
2) JDK版本:JDK1.8.0_121
3) Hadoop版本:hadoop-2.7.3
4) 部署机器的情况: 5) 网络拓扑: 3、docker在线安装(主机)1) 设置DNS
[root@localhost ~]# cat /etc/resolv.conf nameserver 211.138.156.66 2) 安装yum search ifconfig,最小安装版本的没有安装ifconfig,可直接用ip addr [root@localhost ~]# yum -y install net-tools 3) docker安装 [root@localhost ~]# yum install docker 安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动: [root@localhost ~]# service docker start 或[root@localhost ~]# systemctl start docker [root@localhost ~]# chkconfig docker on 4) 关闭防火墙 [root@localhost ~]#firewall-cmd --state #查看默认防火墙状态 [root@localhost ~]#systemctl stop firewalld.service #停止firewall [root@localhost ~]#systemctl disable firewalld.service #禁止firewall开机启动 5) 查看SELinux状态 [root@localhost ~]# /usr/sbin/sestatus -v SELinux status: enabled //enabled表示开启状态 SELinux有临时关闭(不用重启服务器)和永久关闭要重启服务器 6) 禁用SELinux(因为selinux和LXC有冲突,所以需要禁用) 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可reboot 4、docker离线安装(主机todo)5、配置hostname(主机)修改/etc/hostname更改主机名
1) 进入192.168.0.179机器(hadoop0) [root@localhost ~]# vi /etc/hostname hadoop0 2) 进入192.168.0.152机器(hadoop1) [root@localhost ~]# vi /etc/hostname Hadoop1 3) 进入192.168.0.153机器(hadoop2) [root@localhost ~]# vi /etc/hostname Hadoop2 4) 在各主机执行以下命令也是可以 [root@localhost ~]# hostname hadoop0 [root@localhost ~]# su -l 6、配置hosts(主机)【注意】所有机器该配置文件都要保持一致,否则会导致启动HADOOP启不起来,如HADOOP1机器未修改该文件,DATANODE会启不起来 1) 进入hadoop0 [root@hadoop0 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 2) 进入hadoop1 [root@hadoop1 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 3) 进入hadoop2 [root@hadoop2 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 7、关闭SELinux(主机)【注意】如果在安装docker已经关闭过SELinux,那该章节可以跳过 1) 查看SELinux状态 //enabled表示开启状态 [root@hadoop0 /]# /usr/sbin/sestatus -v SELinux status: disabled 2) 禁用SELinux,修改/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled。重启机器即可。由于setenforce 0(立刻生效,不需要重启操作系统)命令经测试没有效果,所以还是建议重启主机 8、关闭防火墙(主机)注意:需要在所有机器上关闭防火墙,否则后面验证hadoop是否安装成功50070和8088就无法访问,另外也会导致时间同步ntp无法进行同步。 1) 进入hadoop0 //停止firewall [root@hadoop0 ~]# systemctl stop firewalld.service //禁止firewall开机启动 [root@hadoop0 ~]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. 2) 进入hadoop1执行相应的命令 systemctl stop firewalld.service systemctl disable firewalld.service 3) 进入hadoop2执行相应的命令 systemctl stop firewalld.service systemctl disable firewalld.service 9、安装时间同步NTP软件(主机)9.1 进入hadoop01) 使用rpm检查ntp包是否安装 [root@hadoop0 ~]# rpm -q ntp 未安装软件包 ntp 2) 使用YUM命令安装ntp [root@hadoop0 ~]# yum -y install ntp 3) 设置系统开机自动启动服务 [root@hadoop0 /]# systemctl enable ntpd [root@hadoop0 /]# systemctl start ntpd 4) 设置ntp服务端配置信息 [root@hadoop0 ~]# vi /etc/ntp.conf //找到以下的server内容并注释 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst //在文件最后加入如下内容: 以下的IP一定要配置成127.127.1.0 server 127.127.1.0 fudge 127.127.1.0 stratum 1 5) 修改完成后重启ntpd服务 [root@hadoop0 ~]# systemctl restart ntpd 6) 查看安装哪些 [root@hadoop0 ~]# rpm -qa |grep ntp ntp-4.2.6p5-25.el7.centos.2.x86_64 ntpdate-4.2.6p5-25.el7.centos.2.x86_64 9.2 进入hadoop11) 使用rpm检查ntp包是否安装 [root@hadoop1 opt]# rpm -q ntpdate 未安装软件包 ntpdate 2) 在客户端只要安装ntpdate就可以 [root@hadoop1 opt]# yum -y install ntpdate 3) 立即执行时间同步 [root@hadoop1 opt]# ntpdate -u 192.168.0.179 31 Jul 18:05:16 ntpdate[10213]: step time server 192.168.0.179 offset 259820.487681 sec 4) 查看时间是否与hadoop0机器的时间是一致的 [root@hadoop1 opt]# date 2017年 07月 31日 星期一 18:06:13 CST 5) 设置定时同步,新增如下参数,每晚1:00同步 [root@hadoop1 ~]# crontab –e 00 01 * * * /usr/sbin/ntpdate 192.168.0.179 6) 重启定时任务 [root@hadoop1 ~]# systemctl restart crond 9.3 进入hadoop2 所有操作与hadoop1是一样的 10、更改SSHD端口为222(主机)注意:由于容器需要启动SSHD服务,这时候如果宿主机也开启了SSHD服务,这样就会出现端口冲突,所以需要将宿主机SSh的默认端口改掉。 1) 更改主机的SSHD服务端口,免得到时候容器里面的SSHD与主机的端口冲突了 [root@hadoop0 ~]# vi /etc/ssh/sshd_config 在在端口#Port 22下面增加Port 222 2) 重启SSHD服务 /etc/init.d/sshd restart 或service sshd restart 11、hadoop镜像准备(主机)11.1 准备生成镜像的文件先把创建镜像的相关文档放到与Dockerfile文档同一个目录 11.2 准备Hadoop配置以下6个配置路径均在hadoop-2.7.3/etc/hadoop目录下,所有机器这6份配置文件都一样。 1) slaves文件 删除原来的所有内容,修改为如下: [root@hadoop0 hadoop]# vi /opt/hadoop-2.7.3/etc/hadoop/slaves hadoop1 hadoop2 2) hadoop-env.sh //设置jdk所在路径 export JAVA_HOME=/opt/jdk1.8.0_121 3) core-site.xml
增加以下配置项: <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop0:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/data/hadoop-2.7.3/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration> 4) hdfs-site.xml
增加以下配置项: <configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop0:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/data/hadoop-2.7.3/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/data/hadoop-2.7.3/tmp/dfs/data</value> </property> </configuration> 5) mapred-site.xml 增加以下配置项: <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop0:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop0:19888</value> </property> </configuration> 6) yarn-site.xml 增加以下配置项: <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>hadoop0:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop0:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop0:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop0:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop0:8088</value> </property> </configuration> 11.3 Dockerfile内容FROM centos MAINTAINER luoll # 注意这里要更改系统的时区设置,因为在 web 应用中经常会用到时区这个系统变量,默认的 CentOS会让你的应用程序发生不可思议的效果哦 ENV DEBIAN_FRONTEND noninteractive #更新源 RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup COPY CentOS7-Base-163.repo /etc/yum.repos.d/ RUN yum clean all RUN yum makecache #安装ssh RUN yum install -y openssh-server openssh-clients RUN mkdir /var/run/sshd RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' RUN /bin/echo 'root:123456' |chpasswd RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers #安装解压命令 RUN yum install -y unzip #安装GCC命令 RUN yum install -y gcc gcc-c++ RUN yum install -y make #为了使用netstat命令 RUN yum -y install net-tools #安装telnet命令 RUN yum install -y telnet #安装witch RUN yum install -y which #安装JDK ADD jdk1.8.0_121 /opt/jdk1.8.0_121 #安装hadoop2.7.3 ADD hadoop-2.7.3 /opt/hadoop-2.7.3 #设置JDK环境变量 ENV JAVA_HOME /opt/jdk1.8.0_121 ENV HADOOP_HOME /opt/hadoop-2.7.3 ENV PATH $PATH:$JAVA_HOME/bin RUN echo "export JAVA_HOME=/opt/jdk1.8.0_121" > /etc/profile.d/java_home.sh RUN echo "export HADOOP_HOME=/opt/hadoop-2.7.3" > /etc/profile.d/hadoop_home.sh RUN echo "export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" > /etc/profile.d/env_path.sh RUN echo $PATH EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] 11.4 创建镜像进入到dokcerfile所在目录执行以下命令生成对应的镜像。
注意:docker build整行命令最后是一个点 [root@hadoop0 ~]# cd /opt/centos7_hadoop2.7_jdk1.8/ [root@hadoop0 centos7_hadoop2.7_jdk1.8]# docker build -t centos_sshd_hadoop . 12、hadoop容器启动(主机)在各个服务器创建并启动容器成功后将可以通过xshell访问对应的IP和22端口就可以操作对应的容器了。 1) 进入hadoop0创建并启动容器 docker run --net=host --name=hadoop0 -v /etc/localtime:/etc/localtime -v /opt/hadoop/logs/:/opt/hadoop-2.7.3/logs/ -v /opt/hadoop/data/:/opt/hadoop-2.7.3/data/ -d centos_sshd_hadoop 命令说明: 第一个 -v :把宿主机的时间挂载给容器,使时间一样 第二个 -v :把宿主机的data目录挂载给容器的hadoop的data目录中 第三个 -v :把宿主机的logs目录挂载给容器的hadoop的logs目录中 --net :使用宿主机的host 2) 进入hadoop1创建并启动容器 docker run --net=host --name=hadoop1 -v /etc/localtime:/etc/localtime -v /opt/hadoop/logs/:/opt/hadoop-2.7.3/logs/ -v /opt/hadoop/data/:/opt/hadoop-2.7.3/data/ -d centos_sshd_hadoop 命令说明: 第一个 -v :把宿主机的时间挂载给容器,使时间一样 第二个 -v :把宿主机的data目录挂载给容器的hadoop的data目录中 第三个 -v :把宿主机的logs目录挂载给容器的hadoop的logs目录中 --net :使用宿主机的host 3) 进入hadoop2创建并启动容器 docker run --net=host --name=hadoop2 -v /etc/localtime:/etc/localtime -v /opt/hadoop/logs/:/opt/hadoop-2.7.3/logs/ -v /opt/hadoop/data/:/opt/hadoop-2.7.3/data/ -d centos_sshd_hadoop 命令说明: 第一个 -v :把宿主机的时间挂载给容器,使时间一样 第二个 -v :把宿主机的data目录挂载给容器的hadoop的data目录中 第三个 -v :把宿主机的logs目录挂载给容器的hadoop的logs目录中 --net :使用宿主机的host 13、ssh免密操作(容器)1) 进入hadoop0容器 [root@hadoop0 hadoop]# ssh-keygen -t rsa (一直回车即可) [root@hadoop0 hadoop]# ssh-copy-id -i hadoop0 (输入密码123456) [root@hadoop0 hadoop]# ssh-copy-id -i hadoop1 [root@hadoop0 hadoop]# ssh-copy-id -i hadoop2 2) 进入hadoop1容器 [root@hadoop1 opt]# ssh-keygen -t rsa [root@hadoop1 hadoop]# ssh-copy-id -i hadoop1 (输入密码123456) 3) 进入hadoop2容器 [root@hadoop2 opt]# ssh-keygen -t rsa [root@hadoop2 hadoop]# ssh-copy-id -i hadoop2 (输入密码123456) 14、格式化(容器)进入hadoop0,该操作只需在hadoop0上执行即可 [root@hadoop0 hadoop]# hadoop namenode -format 15、启动hadoop(容器)进入hadoop0,该操作只需在hadoop0上执行即可 [root@hadoop0 hadoop]# start-all.sh 16、验证(容器)16.1、JPS查看进程在各台机器通过jps查看进程是否启动 1) 进入hadoop0 [root@hadoop0 hadoop]# jps 19185 SecondaryNameNode 19330 ResourceManager 19592 Jps 19006 NameNode 2) 进入hadoop1 [root@hadoop1 opt]# jps 10628 Jps 10426 DataNode 10524 NodeManager 3) 进入hadoop2 [root@hadoop2 opt]# jps 10757 Jps 10554 DataNode 10652 NodeManager 16.2、通过浏览器查看集群运行状态17、新增一个datanode节点1)Docker安装
2)配置hostname
3)配置hosts
Hadoop0、Hadoop1、Hadoop2、Hadoop3都要进行更改
【注意】所有机器该配置文件都要保持一致,否则会导致启动hadoop启不起来,如hadoop1机器未修改该文件,datanode会启不起来 a) 进入hadoop0 [root@hadoop0 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 192.168.0.154 hadoop3 b) 进入hadoop1 [root@hadoop1 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 192.168.0.154 hadoop3 c) 进入hadoop2 [root@hadoop2 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 192.168.0.154 hadoop3 d) 进入hadoop3 [root@hadoop3 ~]# vi /etc/hosts 192.168.0.179 hadoop0 192.168.0.152 hadoop1 192.168.0.153 hadoop2 192.168.0.154 hadoop3 4) 关闭SELinux
5) 关闭防火墙
6) 安装时间同步NTP软件
7) 更改SSHD端口
8) 准备hadoop镜像,以下两种方式选择一种操作即可: a) 利用dockfile创建镜像 b) 把其它机器上的hadoop镜像导出后导到本服务器上 步骤1:进入hadoop0机器导出centos_sshd_hadoop镜像 [root@hadoop0 ~]# docker save centos_sshd_hadoop > /opt/centos_sshd_hadoop.tar 步骤2:把centos_sshd_hadoop.tar包拷到hadoop3机器上 步骤3:在hadoop3导入镜像 docker run --net=host --name=hadoop3 -v /etc/localtime:/etc/localtime -v /opt/hadoop/logs/:/opt/hadoop-2.7.3/logs/ -v /opt/hadoop/data/:/opt/hadoop-2.7.3/data/ -d centos_sshd_hadoop 第一个 -v :把宿主机的时间挂载给容器,使时间一样 第二个 -v :把宿主机的data目录挂载给容器的hadoop的data目录中 第三个 -v :把宿主机的logs目录挂载给容器的hadoop的logs目录中 --net :使用宿主机的host 步骤4:启动服务 [root@hadoop3 ~]# hadoop-daemon.sh start datanode
|