VM虚拟机 - Docker - CentOS 7 - 快速使用Docker从零搭建Hadoop完全分布式集群详细教程(亲测有效,※吐血推荐※)(内含快速启动容器脚本)

阅读须知

  1. 为什么用 docker 搭建 hadoop 集群呢?虚拟机超级超级慢,一开始可以带三台虚拟机,慢慢的连一台都慢死了。一怒之下干脆从零再用 docker 搭一个集群算了。除了开始的一些步骤图形化界面是不用操作的,接下来的操作都一样,大部分坑我都走了,好多操作我都从头执行了好几遍,直接复制即可。

虚拟机-Linux-CentOS 7吐血安装Hadoop2.9.2搭建集群教程(详细图解)

  1. 本博客采用最小安装。一开始我是安装了图形化界面(KDE),由于在 docker 里面不能直接使用 systemctl,如果直接 docker run 会报错:Failed to get D-Bus connection: Operation not permitted。解决方法是在创建容器时加上 --privileged/usr/sbin/init。但是我只要一执行就会跳出图形化界面,进入一个命令行界面,然后就回不去了!!!我以为是 CentOS 版本的问题,用最新版也一样,这个问题困扰了我好久都没解决。一怒之下干脆不要图形化界面了,直接最小安装算了,还没这么卡。但是还是会跳转界面,后来我直接用 XShell 控制虚拟机,懒得看它了。
    在这里插入图片描述
  2. 像 Java、Scala、Hadoop、Hive、Spark 这些东西都是从官网下个 tar 包,再继续操作。所以需要用到共享文件夹。
    在这里插入图片描述
    在这里插入图片描述
  3. 集群配置,所以弄三个容器
-masterslave1slave2
HDFSNameNode
DataNode
DataNodeSecondaryNameNode
DataNode
YarnNodeManagerResourceManager
NodeManager
NodeManager
  1. 过程中适当拍摄快照
    在这里插入图片描述
  2. 每一步都很关键!!!

Ctrl C + Ctrl V 走起 👻👻👻👻

最小安装(可跳)

安装虚拟机和CentOS的过程:

  1. ip addr 查看 IP,接下来的操作都在 XShell
    在这里插入图片描述

  2. 安装必要的工具

yum -y install vim             #编辑器
yum -y install net-tools       #ifconfig
yum -y install httpd
yum -y install wget
yum -y install iproute
yum -y install lsof
yum -y install bash-completion	#tab补全
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake	#gcc

#yum -y update				#升级
#yum -y install kernel-devel	   #升级kernel-devel
#yum -y install kernel-headers
  1. 修改 /etc/vimrc 文件,防止中文乱码,vim /etc/vimrc,添加如下代码
    在这里插入图片描述
set encoding=utf-8
set termencoding=utf-8
set fileencodings=utf-8
  1. 如果想格式化JSON可以在 /etc/vimrc 加上下面的代码:
command! JsonFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :

打开json文件,输入:

:JsonFormat

详解Linux安装GCC方法
vmware + centos 7安装vmtools时提示The path “” is not a valid path to the xxx kernel header
VMware下CentOS7最小化安装及配置
CentOS 7 最小化安装后的注意事项及一些必备组件的安装
CentOS7最小化安装-Linux-1
Linux最小化安装后一般需要安装的命令的rpm包合集
让VIM彻底告别乱码
VIM中格式化json

安装VMware Tool(可直接安装)

  1. 在虚拟机菜单栏中点击 虚拟机 -> 安装 VMware Tools
  2. 创建挂载目录:mkdir /mnt/cdrom
  3. 将光驱挂载到/mnt/cdrom目录:mount /dev/cdrom /mnt/cdrom
  4. 将压缩包拷贝到其它地方:cp /mnt/cdrom/VMwareTools-10.3.2-9925305.tar.gz /opt
  5. 解压:tar -zxvf /opt/VMwareTools-10.3.2-9925305.tar.gz -C /opt
  6. 进入解压出来的目录:cd /opt/vmware-tools-distrib
  7. 安装:./vmware-install.pl。这一步可能会遇到问题:bash:./vmware-install.pl :/usr/bin/perl:bad interpreter:No such file or directory。输入 yum groupinstall “Perl Support” 即可。
  8. 卸载光驱:umount /dev/cdrom

Linux VMware Tools安装步骤简易版
CentOS-7 最小安装VMware-tools
在 Linux 虚拟机中手动安装 VMware Tools

关闭防火墙和Selinux

  1. 输入 systemctl status firewalld.service 查看防火墙状态
  2. 输入 systemctl stop firewalld.service 关闭防火墙
  3. 输入 systemctl disable firewalld.service 关闭防火墙自启
  4. 输入 vim /etc/sysconfig/selinux,将 SELINUX=enforcing 改为 SELINUX=disabled

安装docker

  1. 卸载已安装的较旧的 Docker 以及相关的依赖项。
yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engin
  1. 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  1. 设置仓库源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装最新版本的 Docker Engine-Community 和 containerd
yum -y install docker-ce docker-ce-cli containerd.io
  1. 启动docker 服务:systemctl start docker

  2. 检测 docker 版本:docker version
    在这里插入图片描述

  3. 停止docker服务:systemctl stop docker

  4. 修改镜像源:vim /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://registry.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

迁移docker安装目录

docker镜像容器目录默认存放在 /var/lib/docker,担心后期数据量大导致系统盘空间不足,现把它迁移到其它地方。我有一次好不容易装好了,提示我磁盘空间不足,vim 都用不了了。
在这里插入图片描述

  1. 通过 df -h 看下磁盘大概的情况,找一个大的空间
  2. 创建新目录作为docker的新目录:mkdir -p /opt/docker
  3. 迁移数据:cp -r /var/lib/docker/ /opt/docker
  4. 修改 docker.servicevim /lib/systemd/system/docker.service,在 ExecStart 后面添加 --data-root /opt/docker
  5. systemctl daemon-reload
  6. 重启 docker 服务:systemctl start docker
  7. 查看默认路径是否已修改:docker info | grep " Root Dir",如果修改了会提示这样:Docker Root Dir: /opt/docker
  8. 通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
docker run hello-world

在这里插入图片描述

  1. 删除原目录数据:rm -rf /var/lib/docker

attempt to change docker data-root fails - why
两种方式迁移 Docker 的默认安装 (存储) 目录
docker的/var/lib/docker目录迁移
docker镜像容器目录迁移

docker安装CentOS 7

  1. 拉取指定版本的 CentOS 镜像
docker pull centos:centos7

在这里插入图片描述
2. 查看本地镜像

docker images

在这里插入图片描述

  1. run 运行容器,然后可以通过 exec 命令进入 CentOS 容器。注意两个地方 --privileged/usr/sbin/init,这样你才能使用 systemctl
docker run -itd --privileged -h base --name base centos:centos7 /usr/sbin/init

docker exec -it 77b6c963033b /bin/bash

在这里插入图片描述

安装必要工具

  1. 分别安装 vim、net-tools、iputils-ping 等
yum -y install vim             #编辑器
yum -y install net-tools       #ifconfig
yum -y install iputils-ping    #ping
yum -y install httpd
yum -y install iproute
yum -y install lsof
yum -y install wget
yum -y install rsync			#同步数据
yum -y install bash-completion	#tab补全
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake	#gcc
yum -y install openssh-server   #ssh
yum -y install openssh-clients  #ssh
systemctl start sshd.service    #启动 ssh 服务
systemctl enable sshd.service   #设置 ssh 开机启动
systemctl start rsyncd.service  #启动 rsync 服务
systemctl enable rsyncd.service
  1. 修改 /etc/vimrc 文件,防止中文乱码,vim /etc/vimrc,添加如下代码
    在这里插入图片描述
set encoding=utf-8
set termencoding=utf-8
set fileencodings=utf-8
  1. vim /etc/ssh/sshd_config,将PermitRootLogin,PubkeyAuthentication 的设置打开。
    在这里插入图片描述

  2. 为了保证系统启动的时候也启动 ssh 服务,我们将启动命令放到bashrc文件末尾中:systemctl start sshd.service

vim ~/.bashrc
  1. 这一步很狠猩狼关键passwd。输入你的密码,后面 ssh 登录要用!!!

安装Java和Scala

  1. 在主机将 JDK 和 Scala 复制到容器的 /opt 目录
docker cp /mnt/hgfs/share/jdk-8u241-linux-x64.tar.gz def8faf07d6b:/opt
docker cp /mnt/hgfs/share/scala-2.12.12.tgz def8faf07d6b:/opt
  1. 解压压缩包到 /opt,并重命名
tar -zxvf /opt/jdk-8u241-linux-x64.tar.gz -C /opt
mv /opt/jdk1.8.0_241 /opt/jdk-1.8.0
tar -zxvf /opt/scala-2.12.12.tgz -C /opt
  1. 更改文件的所有者和所在组:chown -R root:root /opt/jdk-1.8.0 && chown -R root:root /opt/scala-2.12.12
  2. 设置环境变量 vim /etc/profile,在末尾添加
#JAVA
export JAVA_HOME=/opt/jdk-1.8.0
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
#Scala
export SCALA_HOME=/opt/scala-2.12.12
#PATH
export PATH=$PATH:${JAVA_HOME}/bin:${SCALA_HOME}/bin
  1. source /etc/profile && java -version && scala -version 查看 Java 和 Scala 是否配置成功
    在这里插入图片描述
  2. 输入 vim ~/.bashrc,加上 source /etc/profile
  3. 记得删除压缩包

安装Hadoop

  1. 在主机将 Hadoop 复制到容器的 /opt 目录
docker cp /mnt/hgfs/share/hadoop-2.9.2.tar.gz def8faf07d6b:/opt
  1. 解压压缩包到 /opt
tar -zxvf /opt/hadoop-2.9.2.tar.gz -C /opt
  1. 更改文件的所有者和所在组:chown -R root:root /opt/hadoop-2.9.2
  2. 配置 core-site.xml($HADOOP_HOME/etc/hadoop/下)fs.default.name 为默认的master节点。hadoop.tmp.dir为hadoop默认的文件路径。如果本机没有的话需要自己通过 mkdir 命令进行创建。
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
</property>
    <!-- 指定hadoop运行时产生文件的存储路径 -->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop-2.9.2/data/tmp</value>
</property>
  1. 创建上面的文件目录:mkdir -p /opt/hadoop-2.9.2/data/tmp
  2. 输入 vim etc/hadoop/hadoop-env.sh,修改 JAVA_HOME 变量,将其改为Java的安装目录($HADOOP_HOME/etc/hadoop/下)
  3. 配置 hdfs-site.xml($HADOOP_HOME/etc/hadoop/下)
<property>
    <name>dfs.replication</name>
    <value>3</value>
    <!-- replication 是数据副本数量,默认为3-->
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>slave2:50090</value>
</property>
  1. 输入 vim etc/hadoop/yarn-env.sh,修改 JAVA_HOME 变量,将其改为Java的安装目录
  2. 配置 yarn-site.xml($HADOOP_HOME/etc/hadoop/下)
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>slave1</value>
</property>
<property>
    <name>yarn.resourcemanager.address</name>
    <value>slave1:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>slave1:8030</value>
</property>
<property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>slave1:8031</value>
</property>
<property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>slave1:8033</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>slave1:8088</value>
</property>
<!-- Site specific YARN configuration properties -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<property>
	<!-- 日志保留7天 -->
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>
  1. 输入 vim etc/hadoop/mapred-env.sh,修改 JAVA_HOME 变量,将其改为Java的安装目录($HADOOP_HOME/etc/hadoop/下)
  2. 输入 mv etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml,将mapred-site.xml.template 重命名为 mapred-site.xml
  3. 配置 mapred-site.xml($HADOOP_HOME/etc/hadoop/下)
<!-- 通知框架MR使用YARN -->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
<property>
<!-- history server address -->
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
</property>
  1. 在master节点配置 $HADOOP_HOME/etc/hadoop/ 下的slaves文件,输入 vim etc/hadoop/slaves(注意不能有空格和空行!!!)删掉 localhost,改为下面
master
slave1
slave2

编写脚本

  1. xcall 在所有主机上同时执行相同的命令:vim /usr/local/bin/xcall
    用法:xcall jps
#!/bin/bash
pcount=$#
if((pcount==0));then
    echo "Error: No args...";
    exit;
fi
# 获取当前主机名
hostname=`hostname`
# 同步到集群其它机器
for target in `cat /opt/hadoop-2.9.2/etc/hadoop/slaves`
do
	echo ==================$target==================
	if [ "$target" != "$hostname" ];then
		ssh $target $@
	else
		$@
    fi
done
  1. xsync 循环复制文件到所有节点的相同目录下:vim /usr/local/bin/xsync
    用法:xsync /opt/hadoop-2.9.2/etc
    rsync主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点。rsync和scp的区别是,rsync只对差异文件更改,scp是将所有文件复制。
#!/bin/sh
# 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0));then
    echo "Error: No args...";
    exit;
fi
# 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
# 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
# 获取当前用户名称
user=`whoami`
# 获取当前主机名
hostname=`hostname`
# 同步到集群其它机器
for target in `cat /opt/hadoop-2.9.2/etc/hadoop/slaves`
do
	if [ "$target" != "$hostname" ];then
		echo "$pdir/$fname->$user@$target:$pdir"
		echo ==================$target==================
		rsync -rvl $pdir/$fname $user@$target:$pdir
    fi
done
rsync  -rvl     $pdir/$fname      $user@$host:$pdir/$fname
 命令   参数   要复制的文件路径/名称   目的用户@主机名:目的路径/名称
  1. 修改权限:chmod a+x /usr/local/bin/xcall && chmod a+x /usr/local/bin/xsync。u:表示用户,g:表示用户组,o: 表示其它,a: 表示所有
  2. jps 建立软连接:ln -sf /opt/jdk-1.8.0/bin/jps /usr/local/bin/
    在这里插入图片描述
  3. 退出容器并停止容器:exitdocker stop 容器ID

Hadoop集群脚本工具rsync、xsync和xcall
简单教你写xsync和xcall的脚本
centos7搭建hadoop集群之xcall脚本
Shell $0, $#, $*, $@, $?, $$的含义

启动集群

  1. 将刚才的容器导出为镜像,并查看当前镜像
docker commit -m "hadoop" -a "hxp" def8faf07d6b hxp/hadoop:1.0

在这里插入图片描述

  1. 为了集群间可以通信,自定义网络
docker network create --driver=bridge --subnet=172.18.0.0/16 hadoop-net
  1. 创建3个容器,master,slave1,slave2。注意数据卷的目录是一个新的空目录,如果目录内有数据会被覆盖。这里固定 IP。
docker run -itd -h master --name master --network hadoop-net --privileged -v /opt/docker:/opt/docker --ip 172.18.0.2 -p 2181:2181 -p 3306:3306 -p 4040:4040 -p 7077:7077 -p 8080:8080 -p 8081:8081 -p 9000:9000 -p 9092:9092 -p 10000:10000 -p 18080:18080 -p 29094:29094 -p 50070:50070 -p 8088:8088 hxp/hadoop:1.0 /usr/sbin/init

docker run -itd -h slave1 --name slave1 --network hadoop-net --privileged -v /opt/docker:/opt/docker --ip 172.18.0.3 hxp/hadoop:1.0 /usr/sbin/init

docker run -itd -h slave2 --name slave2 --network hadoop-net --privileged -v /opt/docker:/opt/docker --ip 172.18.0.4 hxp/hadoop:1.0 /usr/sbin/init

在这里插入图片描述

  1. 在 master 节点 ping 其他节点检测是否正常
    在这里插入图片描述

  2. 在 master 节点的家目录(cd ~)输入 ssh-keygen -t rsa 生成公钥和私钥(中间按三个Enter),然后依次输入 ssh-copy-id masterssh-copy-id slave1ssh-copy-id slave2(交换公钥)。这些操作分别在 slave1 和 slave2 做一次。(密码不正确的想一想是不是上面漏了一个很关键的地方)(logout 退出 ssh)
    在这里插入图片描述

  3. 在每个节点设置时间(东八区),我这里原本是 UTC,所以要设为 CST

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Linux —— 时间(tzselect、timedatactl命令,查看和修改时区,修改时区为东八区)

  1. 进入Hadoop安装目录,格式化 NameNode:bin/hdfs namenode -format
    在这里插入图片描述

  2. 编写启动和停止集群脚本 start-cluster.shstop-cluster.sh。vim /usr/local/bin/start-cluster.sh,vim /usr/local/bin/stop-cluster.sh

#!/bin/sh

/opt/hadoop-2.9.2/sbin/start-dfs.sh
ssh slave1 /opt/hadoop-2.9.2/sbin/start-yarn.sh
#!/bin/sh

/opt/hadoop-2.9.2/sbin/stop-dfs.sh
ssh slave1 /opt/hadoop-2.9.2/sbin/stop-yarn.sh
  1. chmod a+x /usr/local/bin/start-cluster.sh && chmod a+x /usr/local/bin/stop-cluster.sh

  2. 在 master 节点启动集群start-cluster.sh
    在这里插入图片描述

  3. xcall jps,如果出现 jps not found:source /etc/profile
    在这里插入图片描述

  4. 输入 bin/hdfs dfsadmin -report 查看HDFS状态

[root@master hadoop-2.9.2]# bin/hdfs dfsadmin -report
Configured Capacity: 204447940608 (190.41 GB)
Present Capacity: 186659966976 (173.84 GB)
DFS Remaining: 186659942400 (173.84 GB)
DFS Used: 24576 (24 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Pending deletion blocks: 0

-------------------------------------------------
Live datanodes (3):

Name: 172.18.0.2:50010 (master)
Hostname: master
Decommission Status : Normal
Configured Capacity: 68149313536 (63.47 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 5929324544 (5.52 GB)
DFS Remaining: 62219980800 (57.95 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.30%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 05 03:11:08 UTC 2020
Last Block Report: Thu Nov 05 02:52:23 UTC 2020


Name: 172.18.0.3:50010 (slave1.hadoop-net)
Hostname: slave1
Decommission Status : Normal
Configured Capacity: 68149313536 (63.47 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 5929324544 (5.52 GB)
DFS Remaining: 62219980800 (57.95 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.30%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 05 03:11:08 UTC 2020
Last Block Report: Thu Nov 05 02:52:23 UTC 2020


Name: 172.18.0.4:50010 (slave2.hadoop-net)
Hostname: slave2
Decommission Status : Normal
Configured Capacity: 68149313536 (63.47 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 5929324544 (5.52 GB)
DFS Remaining: 62219980800 (57.95 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.30%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 05 03:11:08 UTC 2020
Last Block Report: Thu Nov 05 02:52:23 UTC 2020

https://blog.csdn.net/u012943767/article/details/79767670
docker设置容器固定ip
Docker 配置容器固定IP
docker 创建容器时指定容器ip

Windows连接容器

						|----------------------------------------|
						|                                        |
						|   |--------------------------------|   |
						|   |                                |   |
						|   |    docker(CentOS) 172.18.0.2   |   |
						|   |--------------------------------|   |
						|                                        |
						| Virtual Machine(CentOS) 192.168.27.143 |
						|----------------------------------------|
						
						         Windows 192.168.137.123

由于 docker 容器处于内网,外网不可以直接访问内网,需要添加路由进行转发。当然也可以端口映射,但添加端口有点麻烦。
route add 将发送到 172.18.0.0/16 网段的数据有 192.168.27.143(具体IP) 来转发。(Ifconfig查看,-p永久)

route add -p 172.18.0.0 mask 255.255.0.0 192.168.27.143

道理都懂,找个中间人传递信息嘛,理论上是没问题的。可是为啥我就是 windows ping 不通 docker?这里我搞了好久,最终还是重头再装一次问题才解决(同样的操作,竟然神奇的通了。。。)
大家可以尝试打开并启动防火墙,然后在关闭防火墙,我有一次就是这样好了,也不知道为什么
在这里插入图片描述

Windows连接Linux虚拟机里面的Docker容器
在Windows系统浏览器中访问虚拟机CentOS里面Docker容器运行nginx服务器
解决 docker 容器无法通过 IP 访问宿主机问题
在Windows宿主机中连接虚拟机中的Docker容器
Windows连接虚拟机里面的Docker容器ip
在Windows宿主机中连接虚拟机中的Docker容器总结

测试集群

  1. 在浏览器输入 http://master:50070/,检查 Datanode Information(有可能出现DataNode不够三个)
    在这里插入图片描述
    在这里插入图片描述

  2. 在浏览器输入 http://slave1:8088/
    在这里插入图片描述

  3. 运行 WordCount:

    1. mkdir wcinput && vim wcinput/wc.input
    2. 在刚创建的文件写下
      touch touch
      window window
      sun sun sun sun sun
      phone
      hadoop hadoop hadoop
    3. 上传文件到 HDFS:bin/hdfs dfs -put wcinput/wc.input /
    4. 运行 WordCount:bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wc.input /output

关闭集群

关闭集群:stop-cluster.sh
在这里插入图片描述
出现:nodemanager did not stop gracefully after 5 seconds: killing with kill -9
好吧,这个问题我没解决,不过这个问题影响不大,我就不理它了。大伙有兴趣可以自行解决。我把原因和解决方法贴下面:
原因:原因在 hadoop-daemon.sh 找不到pid文件了,pid文件默认存放在 /tmp,而系统会定时清理该目录中的文件
解决:

  1. 确保关闭了集群
  2. 修改 hadoop 安装目录下的 sbin/hadoop-daemon.sh 的第 26 行
    在这里插入图片描述
  3. 修改 hadoop 安装目录下的 sbin/yarn-daemon.sh 的第 26 行
    在这里插入图片描述
  4. mkdir /opt/hadoop-2.9.2/pid
  5. 同步到其它集群:xsync /opt/hadoop-2.9.2/sbin
    在这里插入图片描述

NodeManager did not stop gracefully after 5 seconds: kill
NodeManager did not stop gracefully after 5 seconds: kill

#docker cp /mnt/hgfs/share/kafka_2.12-2.6.0.tgz def8faf07d6b:/opt
#docker cp /mnt/hgfs/share/apache-flume-1.9.0-bin.tar.gz def8faf07d6b:/opt
#docker cp /mnt/hgfs/share/apache-hive-2.3.7-bin.tar.gz def8faf07d6b:/opt

编写快速启动容器脚本

效果如下:
在这里插入图片描述

#!/bin/bash

pcount=$#
#没有参数则退出程序
if((pcount==0));then
    echo "Error: No args...";
    exit;
fi

i=0
#docker集群数组
array=("master" "slave1" "slave2")

#启动docker
case $1 in
"start"){
	systemctl stop firewalld
    #开启docker服务
    systemctl start docker
    #将容器历史运行记录写到一个临时文件
    docker ps -a | sed '1d' > /tmp/dockerPs
    #循环读取运行记录的每一行
    while read line
    do
        for target in ${array[*]}
        do
            #判断该行是否包含对应的容器
            result=`echo "$line" | grep "$target"`
            if [ "$result" != "" ];then
                #如果包含则取该行记录空格隔开的第一个字符串
                container_id=`echo $line | awk -F " " '{print $1}'`
                #启动容器并打印日志
                echo ==========start ${target}, container_id=`docker start ${container_id}`===========
                #下一个容器
                let i++
           fi
        done
        #全部容器启动完了就跳出循环
        if [ $i -eq ${#array[*]} ];then
            break
        fi
    done < /tmp/dockerPs
    echo " "
    docker ps
};;
"stop"){
    while read line
    do
        for target in ${array[*]}
        do
            result=`echo "$line" | grep "$target"`
            if [ "$result" != "" ];then
                container_id=`echo $line | awk -F " " '{print $1}'`
                echo ==========stop ${target}, container_id=`docker stop ${container_id}`==========
                let i++
           fi
        done
        if [ $i -eq ${#array[*]} ];then
            break
        fi
    done < /tmp/dockerPs
    #删除临时文件
    rm -rf /tmp/dockerPs
    echo " "
    docker ps
    #睡眠15秒,如果发现异常则可以退出
    sleep 15s
    #停止服务
    systemctl stop docker
    echo " "
    systemctl status docker
};;
esac

shell 判断字符串包含的5种方法
shell 数组遍历的3种方法
shell变量计算长度及加减运算方法总结
shell脚本中大于,大于等于,小于,小于等于、不等于的表示方法
shell读取文件每一行的方式
shell字符串空格分隔取第一个_shell按空格分隔字符串

安装MySQL

Linux-VMware15下CentOS 7安装MySQL5.7.28(tar.gz)

安装Hive

Linux-CentOS 7-基于Hadoop安装与配置Hive-2.3.7

安装ZooKeeper

  1. 在主机将 ZooKeeper 复制到容器的 /opt 目录
docker cp /mnt/hgfs/share/zookeeper-3.4.14.tar.gz def8faf07d6b:/opt
  1. 解压压缩包到 /opt
tar -zxvf /opt/zookeeper-3.4.14.tar.gz -C /opt
  1. 更改文件的所有者和所在组:chown -R root:root /opt/zookeeper-3.4.14
  2. 进入 ZooKeeper 目录,复制 zoo-sample.cfg 重命名为 zoo.cfgcp conf/zoo_sample.cfg conf/zoo.cfg。这个名字固定写死,因为zookeeper启动会检查这个文件,根据这个配置文件里的信息来启动服务。
    dataDir:指定zookeeper将数据保存在哪个目录下,如果不修改,默认在/tmp下,这个目录下的数据有可能会在磁盘空间不足或服务器重启时自动被linux清理,所以一定要修改这个地址。
    加上 ZooKeeper 各个节点的 IP 和端口,2888原子广播端口,3888选举端口,zookeeper有几个节点,就配置几个server。
    在这里插入图片描述
dataDir=/opt/zookeeper-3.4.14/data
dataLogDir=/opt/zookeeper-3.4.14/dataLog
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
  1. 创建刚才指定的两个目录:mkdir data dataLog
  2. dataDir 目录下生产一个 myid 文件,其中写上一个数字 X 表明当前机器是哪一个编号的机器(就是刚才的server.X)。
  3. 同步:xsync /opt/zookeeper-3.4.14
  4. 修改 slave1 和 slave2 的 myid
  5. 建立脚本 zkServervim /usr/local/bin/zkServerzkClientvim /usr/local/bin/zkClient
#!/bin/bash

pcount=$#
if((pcount==0));then
    echo "Error: No args...";
    exit;
fi
# 获取当前主机名
hostname=`hostname`

for target in `cat /opt/hadoop-2.9.2/etc/hadoop/slaves`
do
	echo ==================$target==================
	if [ "$target" != "$hostname" ];then
		ssh $target /opt/zookeeper-3.4.14/bin/zkServer.sh $@
	else
		/opt/zookeeper-3.4.14/bin/zkServer.sh $@
    fi
done
#!/bin/bash

/opt/zookeeper-3.4.14/bin/zkCli.sh
  1. chmod a+x /usr/local/bin/zkServer && chmod a+x /usr/local/bin/zkClient
  2. 在各个节点启动 ZooKeeper,再查看 ZooKeeper 状态
#启动ZK服务: 
bin/zkServer.sh start
#停止ZK服务: 
bin/zkServer.sh stop
#重启ZK服务: 
bin/zkServer.sh restart
#查看ZK服务状态: 
bin/zkServer.sh status

在这里插入图片描述

Zookeeper完全分布式集群的搭建
Linux安装zookeeper集群(CentOS7+Zookeeper3.4.10)
zookeeper 集群搭建
Zookeeper系列一:Zookeeper基础命令操作

遇到的问题:

  1. 查看 zookeeper.out 报错:nohup: failed to run command `java’: No such file or directory。
    解决方法:在 ~/.bashrc 加上 source /etc/profile,这样每次系统启动都会执行这个指令。
  2. 找不到 myid,解决方法是在 dataDir 目录下生产一个 myid 文件
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
	at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:156)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:104)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)
Caused by: java.lang.IllegalArgumentException: /opt/zookeeper-3.4.14/data/myid file is missing
	at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:408)
	at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:152)
	... 2 more
Invalid config, exiting abnormally

为什么每次进入命令都要重新source /etc/profile 才能生效?
myid文件缺失导致zookeeper无法启动(myid file is missing)
zookeeper环境搭建中的几个坑[Error contacting service. It is probably not running]的分析及解决
解决zookeeper集群重启 Error contacting service. It is probably not running 问题

安装Kafka

  1. 在主机将 Kafka 复制到容器的 /opt 目录
docker cp /mnt/hgfs/share/kafka_2.12-2.6.0.tgz def8faf07d6b:/opt
  1. 解压压缩包到 /opt,更改文件的所有者和所在组并重命名
tar -zxvf /opt/kafka_2.12-2.6.0.tgz -C /opt
chown -R root:root /opt/kafka_2.12-2.6.0
mv /opt/kafka_2.12-2.6.0 /opt/kafka-2.6.0
  1. 修改 vim /opt/kafka-2.6.0/config/server.properties
broker.id=1
#listeners=PLAINTEXT://master:9092
log.dirs=/opt/kafka-2.6.0/data
zookeeper.connect=master:2181,slave1:2181,slave2:2181
  1. 创建目录:mkdir /opt/kafka-2.6.0/data
  2. 同步:xsync /opt/kafka-2.6.0
  3. 修改 slave1 和 slave2 的 server.properties 的 broker.id
  4. 编写脚本:kafkaServervim /usr/local/bin/kafkaServer
#!/bin/bash

pcount=$#
if((pcount==0));then
    echo "Error: No args...";
    exit;
fi
# 获取当前主机名
hostname=`hostname`

case $1 in
"start"){
	for target in `cat /opt/hadoop-2.9.2/etc/hadoop/slaves`
	do
		echo ==================$target==================
		if [ "$target" != "$hostname" ];then
			ssh $target /opt/kafka-2.6.0/bin/kafka-server-start.sh -daemon /opt/kafka-2.6.0/config/server.properties
		else
			/opt/kafka-2.6.0/bin/kafka-server-start.sh -daemon /opt/kafka-2.6.0/config/server.properties
		fi
	done
};;
"stop"){
	for target in `cat /opt/hadoop-2.9.2/etc/hadoop/slaves`
	do
		echo ==================$target==================
		if [ "$target" != "$hostname" ];then
			ssh $target /opt/kafka-2.6.0/bin/kafka-server-stop.sh
		else
			/opt/kafka-2.6.0/bin/kafka-server-stop.sh
		fi
	done
};;
esac
  1. chmod a+x /usr/local/bin/kafkaServer

  2. 启动 Kafka:kafkaServer start
    在这里插入图片描述

  3. 创建主题(注意:副本数不能超过节点数,同一个节点两个副本没意义):bin/kafka-topics.sh --create --zookeeper master:2181 --replication-factor 2 --partitions 3 --topic test

  4. 查看主题列表:bin/kafka-topics.sh --list --zookeeper master:2181

  5. 查看主题详细信息:bin/kafka-topics.sh --describe --zookeeper master:2181 --topic test
    在这里插入图片描述
    在这里插入图片描述

  6. 运行 producer 并发送信息:bin/kafka-console-producer.sh --broker-list master:9092 --topic test
    This is a message
    This is another message

  7. 运行 consumer 并接收信息:bin/kafka-console-consumer.sh --bootstrap-server master:9092 --topic test --from-beginning(启动多个 consumer 也可以接收消息)
    在这里插入图片描述

kafka中文教程
Kafka常用命令

安装Spark

  1. 在主机将 Kafka 复制到容器的 /opt 目录
docker cp /mnt/hgfs/share/spark-3.0.0-bin-hadoop2.7.tgz def8faf07d6b:/opt
  1. 解压压缩包到 /opt,更改文件的所有者和所在组并重命名
tar -zxvf /opt/spark-3.0.0-bin-hadoop2.7.tgz -C /opt
chown -R root:root /opt/spark-3.0.0-bin-hadoop2.7
mv /opt/spark-3.0.0-bin-hadoop2.7 /opt/spark-3.0.0
  1. 进入 spark 目录并将 conf 下的 slaves.template 改为 slaves:mv conf/slaves.template conf/slavesvim conf/slaves 将 localhost 修改如下

     master
     slave1
     slave2
    
  2. 将 conf 目录下的 spark-env.sh.template 改为 spark-env.sh:mv conf/spark-env.sh.template conf/spark-env.shvim conf/spark-env.sh 修改 spark-env.sh 文件,添加 JAVA_HOME 环境变量和集群对应的 master 节点

     export JAVA_HOME=/opt/jdk-1.8.0
     SPARK_MASTER_HOST=master
     SPARK_MASTER_PORT=7077
     
     export SPARK_HISTORY_OPTS="
     -Dspark.history.ui.port=18080
     -Dspark.history.fs.logDirectory=file:///opt/spark-2.4.8/directory
     -Dspark.history.retainedApplications=7"
     
     export SPARK_CONF_DIR=/opt/spark-2.4.8/conf
     export HADOOP_CONF_DIR=/opt/hadoop-2.10.1/etc/hadoop
     export YARN_CONF_DIR=/opt/hadoop-2.10.1/etc/hadoop
     export SPARK_EXECUTOR_CORES=2
     export SPARK_EXECUTOR_MEMORY=1G
     export SPARK_DRIVER_MEMORY=1G
     export SPARK_WORKER_MEMORY=4G
    
  3. 修改 conf 目录下的 spark-defaults.conf.template 为 spark-defaults.conf:mv conf/spark-defaults.conf.template conf/spark-defaults.conf,修改 spark-default.conf 文件,配置日志存储路径:vim conf/spark-defaults.conf

     spark.eventLog.enabled true
     spark.eventLog.dir file:///opt/spark-3.0.0/directory
    
  4. 创建目录:mkdir /opt/spark-3.0.0/directory

  5. 同步:xsync /opt/spark-3.0.0

  6. 启动:sbin/start-all.shsbin/start-history-server.shjps 查看
    在这里插入图片描述

  7. 执行任务测试

     bin/spark-submit \
     --class org.apache.spark.examples.SparkPi \
     --master spark://master:7077 \
     ./examples/jars/spark-examples_2.12-3.0.0.jar \
     10
    

在这里插入图片描述

  1. http://master:8080/http://master:18080/ 分别查看
    在这里插入图片描述
    在这里插入图片描述

连接外部部署好的 Hive:

  1. 把 ${HIVE_HOME}/conf/hive-site.xml 拷贝到 ${SPARK_HOME}/conf/ 目录下
  2. mysql-connector-java-5.1.48-bin.jar 驱动放到 ${SPARK_HOME}/jars/ 目录下
  3. 如果访问不到 HDFS,则需要把 ${HIVE_HOME}/conf/core-site.xml 和 ${HIVE_HOME}/conf/hdfs-site.xml 拷贝到 ${SPARK_HOME}/conf/目录下
  4. 启动 ${SPARK_HOME}/bin/spark-sql
    在这里插入图片描述

IDEA 连接 Spark 操作 Hive:

  1. 导入依赖
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.12</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.3.7</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
  1. 将 hive-site.xml 文件拷贝到项目的 resources 目录中
  2. 代码验证连接是否成功
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object SQL {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
    val spark: SparkSession = SparkSession.builder()
      .enableHiveSupport()  //<---------要加上这个
      .config(conf).getOrCreate()
    spark.sql("show databases").show
    spark.close()
  }
}

±--------------+
|namespace|
±--------------+
|       default |
|         study |
±--------------+

注意:在开发工具中创建数据库默认是在本地仓库,通过参数修改数据库仓库的地址:
config("spark.sql.warehouse.dir", "hdfs://master:8020/hive/warehouse")
如果遇到 HDFS 权限问题 Permission denied,可以代码最前面增加如下代码解决:
System.setProperty("HADOOP_USER_NAME", "root")

could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running
解决方法:此时HDFS可以上传文件,说明不是HDFS的问题,关闭防火墙

安装PostgreSQL

对应版本可以在官网查看安装步骤:https://www.postgresql.org/download/linux/redhat/
在这里插入图片描述

  1. 安装RPM:yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

  2. 安装PostgreSQL:yum install -y postgresql96-server

  3. 初始化数据库:/usr/pgsql-9.6/bin/postgresql96-setup initdb

  4. 开机启动:systemctl enable postgresql-9.6systemctl start postgresql-9.6

  5. yum安装postgresql,默认会建一个名为”postgres”的系统账号,用于执行PostgreSQL,同时数据库中也会生成一个名为”postgres”的数据库用户,且密码已自动生成,切换用户:su - postgres(切换用户后,提示符变更为“-bash-4.2$”)
    在这里插入图片描述

  6. PostgreSQL在数据库用户同名的系统账号下登录免密,进入数据库:psql -U postgres

  7. 修改密码:alter user postgres with password ‘123456’;

  8. 创建用户:create user root with password ‘123456’;

  9. 创建数据库:create database public_db owner root;

  10. 授权(未赋权则账户只能登录控制台):grant all privileges on database public_db to root;

  11. 退出:\q(列出所有库 \l,列出所有用户 \du,列出库下所有表 \d),退出当前用户:exit
    在这里插入图片描述

  12. 开启远程访问,取消 listen_addresses 的注释,将参数值改为“*”:vim /var/lib/pgsql/9.6/data/postgresql.conf
    在这里插入图片描述
    在这里插入图片描述

  13. 主机认证:vim /var/lib/pgsql/9.6/data/pg_hba.conf,添加对所有地址信任:host all all 0.0.0.0/0 trust
    在这里插入图片描述

  14. 登录数据库:psql -U root -d public_db\q

  15. 开放5432端口,Navicat连接:systemctl start firewalldfirewall-cmd --zone=public --add-port=5432/tcp --permanentfirewall-cmd --reloadfirewall-cmd --zone=public --list-ports

CentOS安装PostgreSQL

动态添加端口映射

Docker动态添加端口映射方法总结【亲测有效】
在已运行的docker中增加映射端口
docker容器添加对外映射端口

遇到的问题

退出docker容器时出现there are stopped jobs如何解决?
Centos7 Docker容器中报错 Failed to get D-Bus connection: Operation not permitted
centos 下ssh命令找不到(-bash: ssh: command not found)
Can’t write viminfo file /*/.viminfo! 的解决办法
Docker 端口映射到宿主机后, 外部无法访问对应宿主机端口

附录:常见框架端口

大数据 默认各框架端口号(已给大佬么整理好,必知)
JAVA各种框架插件常用端口:redis、MySQL、rabbitmq、elasticsearch、tomcat等等
Hadoop集群的各部分常用端口

参考博客

基于 Docker 构建 Hadoop 平台
使用docker构建hadoop集群
Docker搭建Hadoop环境
Docker+Hadoop+Hive+Presto 使用Docker部署Hadoop环境和Presto
使用docker搭建hadoop分布式集群
基于Docker的Hadoop完全分布式安装
Docker安装Hadoop
使用Docker搭建Hadoop集群环境
基于docker的hadoop集群搭建
Docker 学习 | 第六篇:容器网络配置
docker设置容器固定ip
docker 创建容器时指定容器ip

如有错误,请指出哈─=≡Σ(((つ•̀ω•́)つ

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值