一、环境
系统版本 centos7.6
docker版本 Docker version 20.10.10
准备文件:
hadoop-3.3.1.tar.gz #hadoop安装包
hadoopfiles.tar.gz #hadoop内部各种配置文件
jdk1.8.0_201.tar.gz #安装java环境
flink-1.13.6-bin-scala_2.12.tgz #flink安装包
scala-2.12.12.tgz #对应的Scala安装包
CentOS7-Base.repo #换源
二、安装docker
安装需要的依赖包
yum -y install wget jq psmisc vim net-tools nfs-utils telnet yum-utils
yum -y install device-mapper-persistent-data lvm2 git network-scripts tar curl
yum install -y conntrack scoat ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
# 关闭交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a && sysctl -w vm.swappiness=0
cat /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
#
## 关闭 SeLinux
# setenforce 0
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 修改内核参数
yum -y install bridge-utils
modprobe br_netfilter
vim /etc/sysctl.conf
-----
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
-----
sysctl -p
cat <<EOF >> /etc/security/limits.conf
* hard nofile 655360
* soft nofile 655360
* hard nproc 655360
* soft nproc 655360
* soft core 655360
* hard core 655360
root hard nofile 655360
root soft nofile 655360
EOF
### 开启ipvs 转发
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
1) RPM 包安装方法:
提供的官方网址
官方文档:https://docs.docker.com
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 查看所有的可用版本
yum list docker-ce --showduplicates | sort -r
# 安装Docker CE
yum install -y docker-ce
## 安装所需要的指定版本
yum install docker-ce-20.10.24-3.el7 docker-ce-cli-20.10.24-3.el7 docker-ce-rootless-extras-20.10.24-3.el7
## 阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dfmo7maf.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "2048m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
## 添加镜像加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
三、封装镜像
拉取镜像
docker pull centos:7
给容器搭桥
docker network create --driver bridge flink-br
启动容器
docker run -d --name centos7 --privileged=true centos:7 /usr/sbin/init
容器换源装包
拷贝源文件到容器内
docker cp CentOS7-Base.repo centos7:/root
进容器
docker exec -it centos7 /bin/bash
--------------
更换centos7的源
cd /etc/yum.repos.d
mkdir yumbak
把里面的repo进行备份
mv CentOS-* yumbak/
移动源文件到/etc/yum.repos.d下
mv /root/CentOS7-Base.repo .
cd /root
yum clean all
更新软件源目录
yum makecache fast
装包
yum install -y lrzsz git psmisc telnet subversion gpm vim net-tools curl htop openssh-server openssh-clients sudo sshd iproute
容器开启sshd服务
# 开启sshd服务
sudo systemctl daemon-reload
sudo systemctl start sshd
ss -tan
vim /etc/ssh/sshd_config
:set nu
#找到permitrootlogin yes,取消注释 保存退出
:set nu显示行号
第38行 开启permitrootlogin yes
echo 123456 | passwd --stdin root
退出镜像
exit
制作centos7-sshd镜像
制作centos7-sshd:v1镜像
docker commit 9fc072bcb480 centos7-sshd:v1
查看制作的centos7-sshd:v1
docker ps -a
制作centos7-hadoop镜像
tar -zxvf hadoopfiles.tar.g
cd hadoopfiles
mv * /root/bigdata
cd ..
##使用dockerfile构建镜像
vim dockerfile-hadoop-v1
----------------------------------
FROM centos7-sshd:v1
MAINTAINER liyingchun
RUN yum install lrzsz git subversion gpm unzip zip net-tools wget vim curl epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
RUN mkdir -p /opt/bigdata
# 安装jdk
ADD jdk1.8.0_201.tar.gz /opt/bigdata
RUN mv /opt/bigdata/jdk1.8.0_201 /opt/bigdata/jdk
ENV JAVA_HOME /opt/bigdata/jdk
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
## 安装hadoop
ADD hadoop-3.3.1.tar.gz /opt/bigdata/
RUN mv /opt/bigdata/hadoop-3.3.1 /opt/bigdata/hadoop
ENV HADOOP_HOME /opt/bigdata/hadoop
ENV HADOOP_MAPRED_HOME /opt/bigdata/hadoop
ENV PATH $PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 配置 Hadoop
COPY core-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hdfs-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY yarn-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoop-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY yarn-env.sh /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-env.sh /opt/bigdata/hadoop/etc/hadoop/
WORKDIR /opt/bigdata/hadoop
--------------------------------
----------格式化-------
yum install dos2unix
dos2unix dockerfile-hadoop-v1
----------------------------------
运行dockerfile文件
docker build -t hadoop:v1 -f dockerfile-hadoop-v1 . #注意有个点,表示本地文件运行
编译时间长,需耐心等等
启动刚制作的hadoop镜像
运行hadoop:v1镜像
docker run -tid --name hadoop-test hadoop:v1 /bin/bash
查看容器ID
docker ps -a
拷贝flink和scala包到hadoop容器
docker cp flink-1.13.6-bin-scala_2.12.tgz c2600a397dcd:/root
docker cp scala-2.12.12.tgz c2600a397dcd:/root
进入容器
docker exec -it c2600a397dcd /bin/bash
# 解压
cd /root
ll
tar -zxvf flink-1.13.6-bin-scala_2.12.tgz
tar -zxvf scala-2.12.12.tgz
mv scala-2.12.12 /opt/bigdata/
mv flink-1.13.6 /opt/bigdata/
改文件名字
cd /opt/bigdata/
mv flink-1.13.6 flink
mv scala-2.12.12 scala
修改环境变量配置文件
vim /etc/profile
----------------------
##jdk
export JAVA_HOME=/opt/bigdata/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
##hadoop
export HADOOP_HOME=/opt/bigdata/hadoop
PATH=$PATH:$HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=/opt/bigdata/hadoop/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath`
##scala
export SCALA_HOME=/opt/bigdata/scala
PATH=$PATH:$HOME/bin:$SCALA_HOME/bin:$SCALA_HOMT/sbin
##flink
export FLINK_HOME=/opt/bigdata/flink
PATH=$PATH:$HOME/bin:$FLINK_HOME/bin:$FLINK_HOME/sbin
---------------------------------
----------格式化-------
yum install dos2unix
dos2unix /etc/profile
--------------------------------------------------
source /etc/profile
测试jdk环境、hadoop环境
java -version
hadoop version
如果测试没反应,可以重启下容器
docker restart c2600a397dcd
再进容器内部测试
docker exec -it c2600a397dcd /bin/bash
更改flink-conf配置文件
cd /opt/bigdata/flink/conf
:set nu显示行号
vim +192 flink-conf.yaml
# 添加
classloader.check-leaked-classloader: false
vim works
## 填入所有容器节点
--------
flink01
flink02
flink03
提交镜像docker commit 112ee903305d centos7-software:v2 ###112ee903305d是运行的容器id
推送镜像到阿里云仓库
推送
$ docker login --username=lycshnr2022 registry.cn-hangzhou.aliyuncs.com
$ docker tag 843203aa5a4c registry.cn-hangzhou.aliyuncs.com/liyingchun-images/hadoop-test:v1
$ docker push registry.cn-hangzhou.aliyuncs.com/liyingchun-images/hadoop-test:v1
拉取
$ docker pull registry.cn-hangzhou.aliyuncs.com/liyingchun-images/hadoop-test:v1
登出仓库
docker logout registry.cn-hangzhou.aliyuncs.com
至此,咱们的hadoop-flink镜像就制作完毕,下一步就是免密登录,配置hadoop各核心文件参数
四、flink集群实验
使用镜像开辟三个容器
## flink01 容器
docker run -itd --network flink-br --hostname flink01 --name flink01 -p 50070:50070 -p 8088:8088 -p 9000:9000 -p 16010:16010 -p 2181:2181 -p 8020:8020 -p 8080:8080 -p 9020:9020 -p 1022:22 -p 10000:10000 -p 10002:10002 -p 8381:8381 --privileged=true centos7-software:v2 /usr/sbin/init
## flink02 容器
docker run -itd --network flink-br --hostname flink02 --name flink02 -p 10020:10020 -p 19888:19888 -p 2022:22 --privileged=true centos7-software:v2 /usr/sbin/init
## flink03 容器
docker run -itd --network flink-br --hostname flink03 --name flink03 -p 3022:22 --privileged=true centos7-software:v2 /usr/sbin/init
进3台容器,单独开会话窗口,方便操作
docker exec -it flink01 /bin/bash
docker exec -it flink02 /bin/bash
docker exec -it flink03 /bin/bash
查看容器IP
ifconfig
flink01 172.18.0.2
flink02 172.18.0.3
flink03 172.18.0.4
配置免密登录
分别在3台容器上各自修改主机名
hostname flink01
bash
hostname flink02
bash
hostname flink03
bash
变更hosts文件映射
vim /etc/hosts
172.18.0.2 flink01
172.18.0.3 flink02
172.18.0.4 flink03
使用脚本进行免密登录设置
在容器外包,将脚本文件拷贝到容器内
pwd
/root/bigdata
docker cp fgssh 62b6ada4ef16:/root
给脚本加权限
chmod +x fgssh
执行免密脚本
./fgssh -user root -hosts "flink01 flink02 flink03" -advanced -exverify -confirm
输入一次yes
看到enter 就是回车
看到password就是输密码
测试ssh功能是否正常
在flink03上随便建一个文件
scp同步到flink02、flink01上
然后cat同步的文件
测试环境变量
分别在3台机器上测试
java -version
hadoop version
再次查看hadoop配置文件
###每个机器节点都需要核实
cd /opt/bigdata/hadoop/etc/hadoop
#节点
vim workers
#环境
vim hadoop-env.sh
#核心配置
vim core-site.xml
vim hdfs-site.xml
vim mapred-site.xml
vim yarn-site.xml
集群进行初始化操作
# 初始化
cd /opt/bigdata/hadoop
执行
bin/hdfs namenode -format
启动集群组件服务
flink01 容器:
cd /opt/bigdata/hadoop/sbin
./hadoop-daemon.sh start namenode
./hadoop-daemon.sh start datanode
./hadoop-daemon.sh start secondarynamenode
进入flink02 容器:
cd /opt/bigdata/hadoop/sbin
./hadoop-daemon.sh start datanode
进入flink03 容器:
cd /opt/bigdata/hadoop/sbin
./hadoop-daemon.sh start datanode
浏览器输入
192.168.80.28:50070 ##hdfs管理
进入flink01启动yarn:
cd /opt/bigdata/hadoop/sbin
./yarn-daemon.sh start resourcemanager
./yarn-daemon.sh start nodemanager
进入flink02容器启动yarn:
cd /opt/bigdata/hadoop/sbin
./yarn-daemon.sh start nodemanager
./mr-jobhistory-daemon.sh start historyserver
进入flink03 容器启动yarn:
cd /opt/bigdata/hadoop/sbin
./yarn-daemon.sh start nodemanager
打开yarn的web
http://192.168.80.28:8088
测试flink on yarn
Flink or yarn-session模式
Flink on Yarn-Session 模式指的是在 Yarn 集群中以会话模式运行 Apache Flink 应用程序。在 Session模式下,用户可以创建和维护一个长时间运行的Flink会话,并在该会话中提交多个应用程序,在不同的时间异步地运行它们。这种模式能够充分利用集群资源并提高运行效率。
在Session模式下,Flink集群作为长期存在的会话运行,可以被用于提交多个Flink应用程序。
这些应用程序可以共享相同的Flink集群和资源,从而减少了资源占用和管理的负担。
用户可以通过Yarn的管理界面或命令行向Flink集群发送应用程序提交请求。
在接收到提交请求后,Flink会话会根据应用程序的需求分配资源,并启动相应的Flink作业。
在Session模式下,Flink集群和应用程序都可以在同一个Yarn应用程序中运行。对于每个应用程序,Yarn将为该应用程序创建一个不同的容器,容器中会运行一个 Flink TaskManager进程和一个Flink JobManager进程。多个容器中的Flink TaskManager会连接到同一个Flink JobManager,通过该JobManager协调和管理整个Flink集群。
在Flink Session模式中,用户可以通过Web UI或命令行界面来查看每个Flink作业的执行情况、资源使用情况以及日志信息等。同时,Flink支持动态调整任务的资源配置,例如增加某个任务的任务槽数量或内存占用等。
【总结】Flink Session模式是一种长时间运行的Flink集群,可以用于提交多个Flink应用程序,并共享相同的资源和集群。它可以提高资源利用率和运行效率。
复制flink01会话,登录flink01容器
docker exec -it flink01 /bin/bash
cd /opt/bigdata/flink/
1. session 模式测试:
打开一个yarn的session
在提交Job前必须要开始yarn-session
执行命令
bin/yarn-session.sh -n 2 -tm 800 -s 1 -d
-n 表示申请2个容器,这⾥指的就是多少个taskmanager
-s 表示每个TaskManager的slots数量
-jm 表示每个JobManager的内存大小 单位:MB
-tm 表示每个TaskManager的内存⼤小 单位:MB
-d 表示以后台程序⽅式运行
Flink on yarn-Per job模式
Flink on Yarn–Per Job 模式指的是通过向 Yarn 集群提交独立的 Flink 作业来运行 Apache Flink 应用程序。在 Per Job 模式下,每次提交作业时,Flink 会启动一个新的 Flink 集群来运行该作业,作业完成后该集群也会被关闭。这种模式适用于需要独立资源且彼此不相关的场景。
在 Per Job 模式下,用户需要为每个应用程序创建单独的 Yarn 应用程序并调整相应的参数和配置。每个应用程序都会启动一个新的、独立的 Flink 集群,该集群只为当前作业提供资源。
在 Per Job 模式下,Flink 应用程序可以使用 Yarn 集群中的所有可用资源,从而可以充分利用集群资源,并在有限的时间内完成计算任务。
Yarn 的 ResourceManager 会为每个 Flink 作业分配所需的资源,启动相应的容器并进行初始化。
Flink 集群将由一个 JobManager 和多个 TaskManager 组成,它们负责管理和执行传入的作业。
在 Flink Per Job 模式下,用户可以通过 Web UI 或命令行界面来查看每个 Flink 作业的执行情况、资源使用情况以及日志信息等。同时,用户也可以在提交作业之前配置 Flink 集群的参数和资源限制,例如任务槽数量、内存占用等。
【总结】Flink on Yarn–Per Job 模式适用于需要独立资源且彼此不相关的场景。它通过向 Yarn 集群提交独立的 Flink 作业来运行应用程序,并为每个作业启动一个新的 Flink 集群,从而充分利用集群资源,提高了应用程序的计算效率。
运行一个yarn-per-job作业
cd /opt/bigdata/flink
bin/flink run -t yarn-per-job -yjm 1024 -ytm 1024 /opt/bigdata/flink/examples/batch/WordCount.jar
集群模式
cd /opt/bigdata/flink/conf
vim flink-conf.yaml
-------------------
jobmanager.rpc.address: flink01
vim workers
----------------
flink01
flink02
flink03
vim masters
------------
flink01
分发
scp flink-conf.yaml workers masters flink02:/opt/bigdata/flink/conf
scp flink-conf.yaml workers masters flink03:/opt/bigdata/flink/conf
启动集群
cd /opt/bigdata/flink
# 执行启动命令
bin/start-cluster.sh
jps查看启动进程