win10家庭版安装docker并搭建完全分布式hadoop集群、spark集群

编程入门 行业动态 更新时间:2024-10-25 02:30:50

docker在windows10的专业版和家庭版上的安装方法有很大的不同,本文是基于win10家庭版进行的安装。

一、docker的安装

1、查看系统版本

右击“此电脑”“属性”,确认是家庭版win10。

2、下载DockerToolbox

关于dockerToolbox和docker for Windows:docker是运行是需要Linux内核的,官方早期提供的Toolbox方案就是使用虚拟机启动一个linux,然后在这个虚拟机中运行docker,免费的虚拟机当时使用最多的就是virtualbox,所以实际上dockerToolbox安装后,docker是运行在一个virtualbox构建的Linux虚拟机(docker machine)上的;而docker for Windows安装之后,docker是运行在hyper-v构建的虚拟Linux环境中的。换言之,家庭版win10不能直接使用docker for Windows,但是专业版win10可以使用dockerToolbox。基于此,我选择dockerToolbox(并且出问题了重启docker-machine即可,很方便)

进入下载地址,点击下载DockerToolbox-18.03.0-ce.exe

3、安装

双击exe文件,按照默认选项进行安装即可,结束后出现下图的三个应用。

打开 Docker Quickstart Terminal,输入命令

docker create

等待运行完毕后,关闭并重新打开 Docker Quickstart Terminal ,出现下图,表示安装成功。

4、注册和登录

由于后面需要pull镜像,所以需要登录自己的账户。

先去官网注册,注册完成后在 Docker Quickstart Terminal 中输入

docker login

根据提示输入用户名(注册的docker ID)和密码,登录。

至此,就可以使用docker pull镜像了。后面的部分就是搭建集群

二、hadoop集群搭建

1、拉取centos镜像

我选择centos系统,因为自带一个openJDK可以偷一点懒

选择一个国内的镜像站,速度快一点(当然也可以换源,就不用加“daocloud.io/library/”了)

docker pull daocloud.io/library/centos:latest

等待下载结束,输入

docker images

pull成功了。

2、网络设置

由于docker容器的IP是随着容器启动的顺序决定的(例如:第一个启动的容器IP为172.17.0.2,第二个启动的容器IP则为172.17.0.3,以此类推),所以就按顺序启动master,slave1和slave2节点了。

3、创建容器

先执行下面四条命令,否则可能会报错“Error response from daemon:cgroups:cannot find cgroup mount destination:unknown. ”,(重启docker-machine之后也需要执行这四个命令)

docker-machine ssh default
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
exit

按顺序执行如下代码,分别创建master,slave1和slave2容器

docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name master -h master -p 50070:50070 -p 8080:8080 -p 7077:7077 -p 18088:18088 daocloud.io/library/centos /usr/sbin/init
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name slave1 -h slave1  daocloud.io/library/centos /usr/sbin/init
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name slave2 -h slave2  daocloud.io/library/centos /usr/sbin/init


三个容器启动之后,输入

docker ps -a

可以看到三个分别名为master,slave1和slave2的容器正在运行

输入

docker exec -it 容器id /bin/bash 

就能进入容器

按Ctrl+P+Q就退出这个容器了

4、配置ssh

这里因为容器的root密码我们是不知道的所以需要一点小技巧。

4.1 先换yum源 (三个节点都需要换)

执行下面四条命令

yum -y install wget
mv /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun/repo/Centos-8.repo
yum makecache

注意看自己拉下来的最新的centos是什么版本,我的是centos8,所以找的找的centos8的阿里的yum源,不对应,使用yum就会报错了。

4.2 master安装openssh并修改配置文件

安装openssh

yum -y install openssh openssh-server openssh-clients
systemctl start sshd

修改配置文件,使得master设置ssh登录自动添加known_hosts,ssh自动接收新的秘钥

vi /etc/ssh/ssh_config

将原来的StrictHostKeyChecking ask设置StrictHostKeyChecking为no,再执行

systemctl restart sshd

4.3 slave节点的只安装,不修改配置文件

执行下面的命令

yum -y install openssh openssh-server openssh-clients
systemctl start sshd

4.4 修改hosts文件(三个节点都需要)

vi /etc/hosts

4.5 公钥的互相分发

在三个节点上都分别执行下面的命令

ssh-keygen -t rsa
#一路回车
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

然后将各自~/.ssh/authorized_keys文件中的秘钥复制到其他两个节点的~/.ssh/authorized_keys文件中去(进入容器,修改~/.ssh/authorized_keys文件)

三个节点的秘钥都在里面

此时在master执行

ssh root@slave1
ssh root@slave2
ssh成功

5 、Ansible安装

ansible是近几年一个比较火的集群运维工具,配置好ansible的hosts文件,就可以使用命令或者脚本对集群进行操作,非常便捷。

执行

yum -y install epel-release
yum -y install ansible

编辑ansible的hosts文件

vi /etc/ansible/hosts

内容如下

[cluster]
master
slave1
slave2

[master]
master

[slaves]
slave1
slave2

6、 修改docker的hosts文件

由于/etc/hosts文件在容器启动时被重写,直接修改内容在容器重启后不能保留,为了让容器在重启之后获取集群hosts,使用了一种启动容器后重写hosts的方法。
需要在修改~/.bashrc文件,在末尾追加以下指令

:>/etc/hosts
cat >>/etc/hosts<<EOF
127.0.0.1 localhost
172.17.0.2 master
172.17.0.3 slave1
172.17.0.4 slave2
EOF

然后执行

source ~/.bashrc
cat /etc/hosts
hosts文件内容已经被重写了

然后用ansible分发.bashrc至集群slave下

ansible cluster -m copy -a "src=~/.bashrc dest=~/"
出现这种黄色绿色字体表示成功

然后分别到两个slave节点执行

source ~/.bashrc
cat /etc/hosts

7、 使用ansible在在集群中安装openjdk

在master节点执行

ansible cluster -m yum -a "name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=latest"

这里可能需要等一会儿,不要急 网好的话就几分钟。

出现三个节点的changed的黄字就是结束了。

8、 修改hadoop配置文件

首先将本地的hadoop2.7.4的压缩包传到master的opt目录下

链接:https://pan.baidu/s/1Z6oDB0yQanri4iGfm_tkuA
提取码:36q6

docker cp C:/Users/10940/Downloads/hadoop-2.7.4.tar.gz 97c444c90ca7:/opt

cp命令后面的参数分别为本地文件的绝对路径和容器ID:容器内的路径

进入opt目录,解压hadoop压缩包

tar -xzvf hadoop-2.7.4.tar.gz

执行

ls /usr/lib/jvm/

查看openjdk的完整版本

Java_home就是这个

配置Java和hadoop的环境变量

vi ~/.bashrc

在末尾添加

# hadoop
export HADOOP_HOME=/opt/hadoop-2.7.4
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el8_2.x86_64
export PATH=$JAVA_HOME/bin:$PATH

之后

source ~/.bashrc

分别执行

java -version
hadoop version

就会打印出版本;如果hadoop version报错,说找不到which命令,就要在三个节点均先执行

yum install which -y

之后再执行hadoop version就能正常打印版本了。

进入hadoop-2.7.4/etc/hadoop目录

修改core-site.xml
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
        <description>A base for other temporary directories.</description>
    </property>
    <!-- file system properties -->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
    <name>fs.trash.interval</name>
        <value>4320</value>
    </property>
</configuration>
修改 hdfs-site.xml
<configuration>
<property>
   <name>dfs.namenode.name.dir</name>
   <value>/home/hadoop/tmp/dfs/name</value>
 </property>
 <property>
   <name>dfs.datanode.data.dir</name>
   <value>/home/hadoop/data</value>
 </property>
 <property>
   <name>dfs.replication</name>
   <value>3</value>
 </property>
 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>
 <property>
   <name>dfs.permissions.superusergroup</name>
   <value>staff</value>
 </property>
 <property>
   <name>dfs.permissions.enabled</name>
   <value>false</value>
 </property>
</configuration>
修改 mapred-site.xml

因为没有这个文件,所以需要先复制一个

cp mapred-site.xml.template mapred-site.xml
<configuration>
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
<property>
        <name>mapred.job.tracker</name>
        <value>master:9001</value>
</property>
<property>
  <name>mapreduce.jobtracker.http.address</name>
  <value>master:50030</value>
</property>
<property>
  <name>mapreduce.jobhisotry.address</name>
  <value>master:10020</value>
</property>
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>master:19888</value>
</property>
<property>
  <name>mapreduce.jobhistory.done-dir</name>
  <value>/jobhistory/done</value>
</property>
<property>
  <name>mapreduce.intermediate-done-dir</name>
  <value>/jobhisotry/done_intermediate</value>
</property>
<property>
  <name>mapreduce.job.ubertask.enable</name>
  <value>true</value>
</property>
</configuration>
修改 yarn-site.xml
<configuration>
  #<property>
         #<name>yarn.nodemanager.resource.memory-mb</name>
         #<value>2048</value>
  #</property>

  #<property>
        #<name>yarn.nodemanager.resource.cpu-vcores</name>
        #<value>1</value>
  #</property>
    <property>
   <name>yarn.resourcemanager.hostname</name>
   <value>master</value>
 </property>
 <property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
 </property>
 <property>
   <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
   <value>org.apache.hadoop.mapred.ShuffleHandler</value>
 </property>
 <property>
   <name>yarn.resourcemanager.address</name>
   <value>master:18040</value>
 </property>
<property>
   <name>yarn.resourcemanager.scheduler.address</name>
   <value>master:18030</value>
 </property>
 <property>
   <name>yarn.resourcemanager.resource-tracker.address</name>
   <value>master:18025</value>
 </property> <property>
   <name>yarn.resourcemanager.admin.address</name>
   <value>master:18141</value>
 </property>
<property>
   <name>yarn.resourcemanager.webapp.address</name>
   <value>master:18088</value>
 </property>
<property>
   <name>yarn.log-aggregation-enable</name>
   <value>true</value>
 </property>
<property>
   <name>yarn.log-aggregation.retain-seconds</name>
   <value>86400</value>
 </property>
<property>
   <name>yarn.log-aggregation.retain-check-interval-seconds</name>
   <value>86400</value>
 </property>
<property>
   <name>yarn.nodemanager.remote-app-log-dir</name>
   <value>/tmp/logs</value>
 </property>
<property>
   <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
   <value>logs</value>
 </property>
</configuration>
修改slaves文件
删除localhost
添加
slave1
slave2

9、 打包并分发hadoop文件

回到opt目录,执行

tar -cvf hadoop-dis.tar hadoop-2.7.4

创建 hadoop-dis.yaml 文件,内容如下

---
- hosts: cluster
  tasks:
    - name: copy .bashrc to slaves
      copy: src=~/.bashrc dest=~/
      notify:
        - exec source
    - name: copy hadoop-dis.tar to slaves
      unarchive: src=/opt/hadoop-dis.tar dest=/opt

  handlers:
    - name: exec source
      shell: source ~/.bashrc

然后执行

ansible-playbook hadoop-dis.yaml

执行完毕后,hadoop文件就会复制到slave节点的opt目录下,环境变量也更新了。

10、 格式化namenode

hadoop namenode -format

看到Exiting with status 0说明成功

11、 启动集群

start-all.sh

使用jps查看进程,master节点上有4个进程

Jps
ResourceManager
NameNode
SecondaryNameNode

slave节点上有3个进程

NodeManager
DataNode
Jps

执行hadoop自带的程序

hadoop jar /opt/hadoop-2.7.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar pi 5 5

能够完成,说明hadoop集群没有问题了。

在浏览器中输入192.168.99.100:50070也能看到集群状态(这个IP是docker machine的地址)

三、spark集群搭建

spark集群是基于hadoop集群的,剩下的部分就比较简单了。

1、下载spark、Scala、zookeeper

Scala和spark有版本的对应关系,建议下载之前到网上搜一下

wget http://mirrors.tuna.tsinghua.edu/apache/spark/spark-2.4.7/spark-2.4.7-bin-hadoop2.7.tgz
wget http://archive.apache/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz

Scala2.11.11我没有找到镜像,是在本机上下载,传进容器的

链接:https://pan.baidu/s/1O8bJGmLV28SQY_sulXFiuQ
提取码:iotw

docker cp C:/Users/10940/Downloads/scala-2.11.11.tgz 97c444c90ca7:/opt

2、安装zookeeper

进入opt目录

tar xvzf zookeeper-3.4.9.tar.gz

修改 ~/.bashrc 文件,增加zookeeper的环境变量,内容如下

#zookeeper
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.9
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source ~/.bashrc

修改zookeeper的配置信息

cd zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

修改、添加如下信息

#修改
dataDir=/opt/zookeeper-3.4.9/tmp
#添加
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

接下来添加 myid 文件

cd ../
mkdir tmp
cd tmp
vi myid
#在master的myid文件中写1,slave1写2,slave2写3

3、安装spark

回到opt目录,解压spark

tar xvzf spark-2.4.7-bin-hadoop2.7.tgz

修改 ~/.bashrc, 配置 spark 环境变量,增加内容如下

#spark
export SPARK_HOME=/opt/spark-2.4.7-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
source ~/.bashrc

修改 spark 配置文件

cd spark-2.4.7-bin-hadoop2.7/conf
cp spark-env.sh.template spark-env.sh
vi spark-env.sh

添加如下内容

export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=128m
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el8_2.x86_64
export SCALA_HOME=/opt/scala-2.11.11  
export SPARK_HOME=/opt/spark-2.4.7-bin-hadoop2.7
export HADOOP_CONF_DIR=/opt/hadoop-2.7.4/etc/hadoop
export SPARK_LIBRARY_PATH=$SPARK_HOME/lib
export SCALA_LIBRARY_PATH=$SPARK_LIBRARY_PATH
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_MASTER_PORT=7077

修改slaves文件

vi slaves

将内容改成

slave1
slave2 

4、安装Scala

回到opt目录

解压Scala

tar xvzf scala-2.11.11.tgz

修改 ~/.bashrc, 配置 Scala 环境变量,内容如下

#scala
export SCALA_HOME=/opt/scala-2.11.11
export PATH=$PATH:$SCALA_HOME/bin

5、将spark、Scala、zookeeper传到slave

scp -r /opt/spark-2.4.7-bin-hadoop2.7 root@slave1:/opt
scp -r /opt/scala-2.11.11 root@slave1:/opt
scp -r /opt/zookeeper-3.4.9 root@slave1:/opt
scp -r /opt/spark-2.4.7-bin-hadoop2.7 root@slave2:/opt
scp -r /opt/scala-2.11.11 root@slave2:/opt
scp -r /opt/zookeeper-3.4.9 root@slave2:/opt

6、修改slave节点的~/.bashrc文件

我是直接将master节点的内容复制过去,然后source

别忘了修改zookeeper的myid文件

7、集群启动

#启动hadoop
start-dfs.sh
start-yarn.sh
#启动spark
start-all.sh
#启动zookeeper(目前spark集群不需要zookeeper,不启动zookeeper也能正常启动spark)
zkServer.sh start(三个节点都执行才能使用zkServer.sh status查看状态)
zookeeper

可以看到master节点中有Master进程,slave节点有Worker进程

执行自带的程序测试spark集群

run-example SparkPi

执行的非常快,输出PI的值

测试代码在yarn模式的运行

spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster examples/jars/spark-examples_2.11-2.4.7.jar 100

浏览器中输入192.168.99.100:8080,可以看到集群有两个Worker

8、集群的关闭

一定要输入命令结束集群运行,不然下次启动很有可能报错!

stop-all.sh
stop-yarn.sh
stop-dfs.sh

四、创建镜像

为了防止集群坏了重新再搭建,将配好的容器创建镜像,一旦集群崩了,就按照master、slave1、slave2的顺序使用我们创建的镜像启动容器即可。

docker commit master master:v1
docker commit slave1 slave1:v1
docker commit slave2 slave2:v1

更多推荐

win10家庭版安装docker并搭建完全分布式hadoop集群、spark集群

本文发布于:2023-06-13 08:00:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1361429.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:集群   分布式   家庭版   docker   hadoop

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!