# hadoop集群搭建 ## 安装zookeeper/kafka集群 ### 下载zookeeper以及kafka zookeeper下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2.tar.gz ### 分布式安装部署zookeeper | | Zk-kafka1 | Zk-kafka2 | Zk-kafka3 | | --------- | --------------- | --------------- | --------------- | | zookeeper | /opt/zookeeper | /opt/zookeeper | /opt/zookeeper | | Kafka | /opt/kafka | /opt/kafka | /opt/kafka | | ip | 192.168.116.101 | 192.168.116.102 | 192.168.116.103 | ``` 安装时间同步ntpdate yum -y install ntpdate crontab -e * * * * * /usr/sbin/ntpdate time.windows.com 安装jdk,版本为build 1.8.0_191-b12 二进制版本 [root@zk-kafka1 ~]# tar -xf jdk-8u191-linux-x64.tar.gz -C /opt/ 修改环境变量 [root@zk-kafka1 jdk1.8.0_191]# vi /etc/profile 添加一下内容 export JAVA_HOME=/opt/jdk1.8.0_191 export JAVA_BIN=$JAVA_HOME/bin export PATH=$PATH:$JAVA_BIN export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 所有机器关闭防火墙以及selinux systemctl disable firewalld --now setenforce 0 sed -ri 's/(SELINUX=).*/\1disabled/' /etc/selinux/config [root@zk-kafka1 jdk1.8.0_191]# source /etc/profile 将jdk拷贝到zk-kafka2/3 [root@zk-kafka1 jdk1.8.0_191]# scp -r /opt/jdk1.8.0_191 192.168.110.161:/opt/ [root@zk-kafka1 jdk1.8.0_191]# scp -r /opt/jdk1.8.0_191 192.168.110.162:/opt/ 将profile拷贝到zk-kafka2/3 [root@zk-kafka1 jdk1.8.0_191]# scp /etc/profile 192.168.110.161:/etc/ [root@zk-kafka1 jdk1.8.0_191]# scp /etc/profile 192.168.110.162:/etc/ Zk-kafka2/3分别source [root@zk-kafka2 lib]# source /etc/profile [root@zk-kafka3 ~]# source /etc/profile 配置hosts文件 [root@zk-kafka1 ~]# cat >> /etc/hosts <zkData/myid 配置zoo.cfg文件 [root@zk-kafka1 conf]# cd /opt/zookeeper/conf/ [root@zk-kafka1 conf]# mv zoo_sample.cfg zoo.cfg [root@zk-kafka1 conf]# vi zoo.cfg 修改数据存储路径为/opt/zookeeper/zkData dataDir=/opt/zookeeper/zkData 增加集群配置 #######################cluster########################## server.1=192.168.110.160:2888:3888 server.2=192.168.110.161:2888:3888 server.3=192.168.110.162:2888:3888 配置参数解读 server.A=B:C:D A 是一个数字,表示第几号服务器,对应zkData/myid文件的配置,zookeeper启动时会读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断当前到底是哪个server B 是服务器的ip地址 C 是这个服务器与集群中Leader服务器交换信息的端口,也就是同步数据用的端口 D 是集群中Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的leader,而这个端口就是用来选举时服务器相互通信的端口 将/opt目录下的所有同步到zk-kafka2/zk-kafka3上 [root@zk-kafka1 ~]# scp -r /opt/zookeeper 192.168.110.161:/opt/ [root@zk-kafka1 ~]# scp -r /opt/zookeeper 192.168.110.162:/opt/ 分别修改zk-kafka2/3 ./zkData/myid [root@zk-kafka2 zookeeper]# echo 2 > /opt/zookeeper/zkData/myid [root@zk-kafka3 ~]# echo 3 > /opt/zookeeper/zkData/myid 分别启动zookeeper /opt/zookeeper/bin/zkServer.sh start 查看集群状态 [root@zk-kafka3 ~]# /opt/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leader [root@zk-kafka2 zookeeper]# /opt/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower [root@zk-kafka1 logs]# /opt/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower ``` ### 分布式安装kafka ``` [root@zk-kafka1 ~]# tar -xf kafka_2.13-2.6.0.tgz -C /opt/ [root@zk-kafka1 ~]# cd /opt/ && mv kafka_2.13-2.6.0/ kafka 创建数据目录 [root@zk-kafka1 opt]# cd kafka/ && mkdir data 修改配置文件 [root@zk-kafka1 kafka]# vi config/server.properties #全局唯一编号不能重复 broker.id=0 #开启删除topic功能 delete.topic.enable=true #监听地址设置,如果不设置默认为PLAINTEXT://hostname:9092 listeners=PLAINTEXT://192.168.110.161:9092 advertised.listeners=PLAINTEXT://192.168.110.161:9092 #处理网络请求的线程数 num.network.threads=3 #用来处理磁盘iO的线程数量 num.io.threads=8 #发送套接字的缓冲区大小 socket.send.buffer.bytes=102400 #接受套接字的缓冲区大小 socket.receive.buffer.bytes=102400 #请求套接字的缓冲区大小 socket.request.max.bytes=104857600 #kafka的数据存放路径 log.dirs=/opt/kafka/data #topic在当前broker上的分区个数 num.partitions=1 #用来恢复和清理data下数据的线程数量 num.recovery.threads.per.data.dir=1 #segment文件保留最长时间,超时将被删除,默认是7天 log.retention.hours=168 #segment最大大小为1g,超过了将新建一个segment文件 log.segment.bytes=1073741824 #配置连接zookeeper地址 zookeeper.connect=zk-kafka1:2181,zk-kafka2:2181,zk-kafka3:2181 将kafka同步到zk-kafka2/3上 [root@zk-kafka1 kafka]# scp -r /opt/kafka/ 192.168.110.161:/opt/ [root@zk-kafka1 kafka]# scp -r /opt/kafka/ 192.168.110.162:/opt/ 分别修改zk-kafka2/3上broker.id [root@zk-kafka2 ~]# vi /opt/kafka/config/server.properties broker.id=1 [root@zk-kafka3 ~]# vi /opt/kafka/config/server.properties broker.id=2 启动集群 /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties ``` ### 安装zk_web,只需要在zk-kafka1上安装即可 ``` yum -y install yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum update -y && yum install -y docker-ce mkdir /etc/docker cat >> /etc/docker/daemon.json <> /etc/hosts < fs.defaultFS hdfs://mycluster hadoop.tmp.dir /opt/hadoop/data/tmp dfs.journalnode.edits.dir /opt/hadoop/data/tmp/data ha.zookeeper.quorum zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181 hdfs-site.xml dfs.nameservices mycluster dfs.ha.namenodes.mycluster nn1,nn2 dfs.namenode.rpc-address.mycluster.nn1 192.168.110.165:9000 dfs.namenode.rpc-address.mycluster.nn2 192.168.110.166:9000 dfs.namenode.http-address.mycluster.nn1 192.168.110.165:50070 dfs.namenode.http-address.mycluster.nn2 192.168.110.166:50070 dfs.namenode.shared.edits.dir qjournal://192.168.110.165:8485;192.168.110.166:8485;192.168.110.167:8485/mycluster dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider ``` ###### workers 工作节点配置文件,之前的版本叫slaves ``` hadoop1 hadoop2 hadoop3 ``` ###### hadoop-env.sh添加JAVA_HOME环境变量 ``` export JAVA_HOME=/opt/jdk1.8.0_191 ``` ###### yarn-env.sh添加 JAVA_HOME环境变量 ``` export JAVA_HOME=/opt/jdk1.8.0_191 ``` ##### 将hadoop同步到hadoop2/3机器上 ``` [root@hadoop1 hadoop]# scp -r /opt/hadoop/ 192.168.110.166:/opt/ [root@hadoop1 hadoop]# scp -r /opt/hadoop/ 192.168.110.167:/opt/ ``` ##### 启动HDFS-HA集群 ``` 各个journalNode节点上,输入以下命令启动journalNode服务 cd /opt/hadoop/ sbin/hadoop-daemon.sh start journalnode 在nn1上对其进行格式化,并启动 [root@hadoop1 hadoop]# bin/hdfs namenode -format [root@hadoop1 hadoop]# sbin/hadoop-daemon.sh start namenode 在nn2 上同步nn1的元数据信息,并启动 [root@hadoop2 hadoop]# bin/hdfs namenode -bootstrapStandby [root@hadoop2 hadoop]# sbin/hadoop-daemon.sh start namenode ``` 查看web页面 ![img](/images/posts/wps1.jpg) ![image-20210516150936259](/images/posts/image-20210516150936259.png) ``` 在nn1上启动所有的datanode [root@hadoop1 hadoop]# sbin/hadoop-daemons.sh start datanode 将nn1切换为active [root@hadoop1 hadoop]# bin/hdfs haadmin -transitionToActive nn1 查看nn1是否为active [root@hadoop1 hadoop]# bin/hdfs haadmin -getServiceState nn1 active ``` ##### 配置HDFS-HA自动故障转移 ``` 1、在etc/hadoop/hdfs-site.xml 添加配置 dfs.ha.automatic-failover.enabled true 2、etc/hadoop/core-site.xml 添加配置 ha.zookeeper.quorum 192.168.110.160:2181,192.168.110.161:2181,192.168.110.162:2181 同步到hadoop2、3 [root@hadoop1 hadoop]# rsync -alv --delete etc/ 192.168.110.166:/opt/hadoop/etc/ [root@hadoop1 hadoop]# rsync -alv --delete etc/ 192.168.110.167:/opt/hadoop/etc/ 3、关闭所有HDFS服务 由于我们使用的是root用户,所以需要在关闭脚本里面添加环境变量 [root@hadoop1 hadoop]# vim sbin/stop-dfs.sh #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=root HDFS_ZKFC_USER=root HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root HDFS_JOURNALNODE_USER=root [root@hadoop1 hadoop]# sbin/stop-dfs.sh 4 初始化HA在Zookeeper中的状态 [root@hadoop1 hadoop]# bin/hdfs zkfc -formatZK 5 启动所有HDFS服务,同样也需要在启动脚本添加环境变量 [root@hadoop1 hadoop]# vim sbin/start-dfs.sh #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=root HDFS_ZKFC_USER=root HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root HDFS_JOURNALNODE_USER=root [root@hadoop1 hadoop]# sbin/start-dfs.sh 注意在测试自动切换之前需要安装系统工具,否则无法自动切换,namenode节点都需要安装 yum install psmisc 具体原因估计切换脚本使用的killall来杀进程的 6、测试,关闭nn1的namenode,看nn2是否自动提升为active [root@hadoop1 hadoop]# jps 22000 DFSZKFailoverController 21498 DataNode 23578 NameNode 23757 Jps 21759 JournalNode [root@hadoop1 hadoop]# kill -9 23578 ``` 网页查看nn2 ![image-20210516151103747](/images/posts/image-20210516151103747.png) 可以看到自动升级为了acticve状态 ##### YARN-HA配置 ###### 1、YARN-HA工作机制 官方文档: https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html 工作机制: ![img](/images/posts/wps2.jpg) ###### 配置YARN-HA集群 修改配置 yarn-site.xml ``` yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id cluster1 yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.hostname.rm1 192.168.110.167 yarn.resourcemanager.hostname.rm2 192.168.110.166 yarn.resourcemanager.webapp.address.rm1 192.168.110.167:8088 yarn.resourcemanager.webapp.address.rm2 192.168.110.166:8088 hadoop.zk.address 192.168.110.160:2181,192.168.110.161:2181,192.168.110.162:2181 注意由于使用的root,所以需要在启动和停止脚本添加环境变量 sbin/stop-yarn.sh / sbin/start-yarn.sh YARN_RESOURCEMANAGER_USER=root YARN_NODEMANAGER_USER=root 将配置同步到其他节点 [root@hadoop1 hadoop]# rsync -alv --delete etc/ 192.168.110.166:/opt/hadoop/etc/ [root@hadoop1 hadoop]# rsync -alv --delete etc/ 192.168.110.167:/opt/hadoop/etc/ 启动yarn [root@hadoop1 hadoop]# sbin/start-yarn.sh 测试,通过网页访问发现,现在192.168.110.166:8088/cluster 可以访问,说明当前是active状态 [root@hadoop2 hadoop]# jps 21394 NodeManager 18868 JournalNode 18997 DFSZKFailoverController 21305 ResourceManager 21769 Jps 18766 DataNode 20350 NameNode You have new mail in /var/spool/mail/root [root@hadoop2 hadoop]# kill -9 21305 ``` 访问hadoop3上的8088 ![image-20210516151319705](/images/posts/image-20210516151319705.png) ``` 或者可以通过命令查看活跃状态 [root@hadoop1 hadoop]# bin/yarn rmadmin -getServiceState rm1 actice [root@hadoop1 hadoop]# bin/yarn rmadmin -getServiceState rm2 standby ``` ### 安装hbase #### 下载hbase并解压 下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.3.3/hbase-2.3.3-bin.tar.gz ``` [root@hadoop1 ~]# tar -xf hbase-2.3.3-bin.tar.gz -C /opt/ [root@hadoop1 ~]# mv /opt/hbase-2.3.3-bin /opt/hbase ``` #### HBase的配置文件 ``` Hbase对应的配置文件修改 1、/opt/hbase/conf/hbase-env.sh 修改内容 [root@hadoop1 hbase]# egrep -v '^#|^$' /opt/hbase/conf/hbase-env.sh export JAVA_HOME=/opt/jdk1.8.0_191 export HBASE_MANAGES_ZK=false 2、/opt/hbase/conf/hbase-site.xml内容修改: hbase.rootdir hdfs://mycluster/hbase hbase.cluster.distributed true hbase.unsafe.stream.capability.enforce false hbase.zookeeper.quorum 192.168.110.160:2181,192.168.110.161:2181,192.168.110.162:2181 hbase.master.port 16000 如果zookeeper也是装在这台机器上,可以独立指定zookeeper的数据目录 hbase.zookeeper.property.dataDir /opt/zookeeper/zkData 3、/opt/hbase/conf/regionservers hadoop1 hadoop2 hadoop3 4、软连接hadoop配置文件到hbase [root@hadoop1 hbase]# ln -sf /opt/hadoop/etc/hadoop/core-site.xml /opt/hbase/conf/core-site.xml [root@hadoop1 hbase]# ln -sf /opt/hadoop/etc/hadoop/hdfs-site.xml /opt/hbase/conf/hdfs-site.xml 5、hbase配置高可用hmaster,需要创建配置文件backup-masters [root@hadoop1 hbase]# cat /opt/hbase/conf/backup-masters 192.168.110.167 6、将hbase发送到其他机器hadoop2/3 [root@hadoop1 hbase]# rsync -avl /opt/hbase 192.168.110.166:/opt/ [root@hadoop1 hbase]# rsync -avl /opt/hbase 192.168.110.167:/opt/ 7、hbase服务启动 启动方式1 [root@hadoop1 hbase]# /opt/hbase/bin/hbase-daemon.sh start master [root@hadoop1 hbase]# /opt/hbase/bin/hbase-daemon.sh start regionserver 对应的关闭方式 /opt/hbase/bin/hbase-daemon.sh stop master /opt/hbase/bin/hbase-daemon.sh stop regionserver 启动方式2 /opt/hbase/bin/start-hbase.sh 对应的关闭方式 /opt/hbase/bin/stop-hbase.sh ``` 网页访问 ![image-20210516151553668](/images/posts/image-20210516151553668.png) ### 安装sqoop #### 下载sqoop,并解压 下载sqoop https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz ``` [root@hadoop1 ~]# tar -xf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/ [root@hadoop1 ~]# cd /opt/ [root@hadoop1 opt]# mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop ``` #### 修改配置文件 ``` 重命名配置文件 [root@hadoop1 opt]# mv /opt/sqoop/conf/sqoop-env-template.sh /opt/sqoop/conf/sqoop-env.sh 修改配置文件 /opt/sqoop/conf/sqoop-env.sh,添加配置 export HADOOP_COMMON_HOME=/opt/hadoop export HBASE_HOME=/opt/hbase ``` #### 尝试连接访问 ``` /opt/sqoop/bin/sqoop list-tables --connect jdbc:mysql://192.168.110.95:3306/ --username DemoCloudUser --password 123456@lcb ``` 出现如下图的报错 ![img](/images/posts/wps3.jpg) ``` 报错原因已经很明显了,没有找到类org.apache.commons.lang.StringUtils 也就是说sqoop中没有这个类或者这个类的jar包 下载地址: http://mirror.bit.edu.cn/apache//commons/lang/binaries/ 注意:尽量下载2版本,因为sqoop版本大部分支持2 [root@hadoop1 ~]# tar -xf commons-lang-2.6-bin.tar.gz [root@hadoop1 commons-lang-2.6]# cp *.jar /opt/sqoop/lib/ 再次执行 [root@hadoop1 commons-lang-2.6]# /opt/sqoop/bin/sqoop list-tables --connect jdbc:mysql://192.168.110.95:3306/AllianceCloud --username DemoCloudUser --password 123456@lcb ``` ![image-20210516152121402](/images/posts/image-20210516152121402.png) ### 安装flume #### 下载flume,并解压 下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz ``` [root@hadoop1 ~]# tar -xf apache-flume-1.9.0-bin.tar.gz -C /opt/ [root@hadoop1 ~]# cd /opt/ [root@hadoop1 opt]# mv apache-flume-1.9.0-bin/ flume ``` ### 安装Flink #### 下载Flink,并解压 下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.12.0/flink-1.12.0-bin-scala_2.11.tgz ``` [root@hadoop1 ~]# tar -xf flink-1.12.0-bin-scala_2.11.tgz -C /opt/ [root@hadoop1 ~]# cd /opt/ [root@hadoop1 opt]# mv flink-1.12.0/ flink ``` #### JobManager高可用配置 ``` [root@hadoop1 flink]# cd /opt/hadoop/etc/hadoop/ 在yarn-site.xml 中添加配置 yarn.resourcemanager.am.max-attempts 4 The maximum number of application master execution attempts. 分发到其他机器 [root@hadoop1 hadoop]# rsync -alv . 192.168.110.166:/opt/hadoop/etc/hadoop/ [root@hadoop1 hadoop]# rsync -alv . 192.168.110.167:/opt/hadoop/etc/hadoop/ 重启yarn [root@hadoop1 hadoop]# ../../sbin/stop-yarn.sh [root@hadoop1 hadoop]# ../../sbin/start-yarn.sh 配置flink配置文件 [root@hadoop1 hadoop]# cd /opt/flink/conf/ [root@hadoop1 conf]# vim flink-conf.yaml #jobmanager.rpc.address: localhost 注释掉 #添加一下内容 high-availability: zookeeper high-availability.zookeeper.quorum: 192.168.110.160:2181,192.168.110.161:2181,192.168.110.162:2181 high-availability.storageDir: hdfs:///flink/recovery high-availability.zookeeper.path.root: /flink yarn.application-attempts: 10 修改masters文件 [root@hadoop1 conf]# vim masters 192.168.110.165 192.168.110.166 修改workers文件 192.168.110.165 192.168.110.166 192.168.110.167 分发到hadoop2/3机器上 [root@hadoop1 conf]# rsync -alv /opt/flink 192.168.110.166:/opt/ [root@hadoop1 conf]# rsync -alv /opt/flink 192.168.110.167:/opt/ 配置环境变量 [root@hadoop1 conf]# vim /etc/profile 添加如下配置 #flink环境变量配置 export FLINK_HOME=/opt/flink/ export PATH=$PATH:$FLINK_HOME/bin #flink on yarn配置 HADOOP_CONF_DIR=/opt/hadoop/ export PATH=$PATH:$HADOOP_CONF_DIR/bin:$HADOOP_CONF_DIR/sbin export HADOOP_CLASSPATH=`/opt/hadoop/bin/hadoop classpath` 分发到hadoop2/3上 [root@hadoop1 conf]# rsync -avl --delete /etc/profile 192.168.110.166:/etc/ [root@hadoop1 conf]# rsync -avl --delete /etc/profile 192.168.110.167:/etc/ 启动flink [root@hadoop1 conf]# ../bin/start-cluster.sh 关闭flink [root@hadoop1 conf]# ../bin/stop-cluster.sh ``` #### 测试 向yarn申请资源并提交任务 Session模式有两种 第一种attached mode ,也是默认的,客户端提交给yarn,前台运行,如下 ``` 1、申请资源 [root@hadoop1 conf]# ../bin/yarn-session.sh -nm wordCount -n 2 2、查看申请的资源 使用命令查看 [root@hadoop1 flink]# /opt/hadoop/bin/yarn application --list 3、使用webui查看,用命令查看的时候会有一个Tracking-URL地址 ``` ![image-20210516152617048](/images/posts/image-20210516152617048.png) 第二种 detached mode (-d or --detached),客户端提交给yarn,客户端直接返回,属于后台运行 ``` [root@hadoop1 flink]# bin/yarn-session.sh --detached ``` ![image-20210516152700645](/images/posts/image-20210516152700645.png) ### 安装Zeppelin #### 下载Zepplin,并解压 下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/zeppelin/zeppelin-0.9.0-preview2/zeppelin-0.9.0-preview2-bin-all.tgz ``` [root@hadoop1 ~]# tar -xf zeppelin-0.9.0-preview2-bin-all.tgz -C /opt/ [root@hadoop1 ~]# cd /opt/ [root@hadoop1 opt]# mv zeppelin-0.9.0-preview2-bin-all/ zeppelin ``` #### 配置zeppelin ``` [root@hadoop1 opt]# cp zeppelin-site.xml.template zeppelin-site.xml [root@hadoop1 opt]# vim zeppelin-site.xml 修改监听地址 zeppelin.server.addr 0.0.0.0 Server binding address 启动 [root@hadoop1 opt]# ../bin/zeppelin-daemon.sh start 关闭 [root@hadoop1 opt]# ../bin/zeppelin-daemon.sh stop 与flink集成(注意目前只支持flink1.10版本),配置interpreter ``` ![image-20210516152950041](/images/posts/image-20210516152950041.png) ``` 配置环境变量 FLINK_HOME /opt/flink flink.execution.mode yarn HADOOP_CONF_DIR /opt/hadoop/etc/hadoop ``` ![img](/images/posts/wps4.jpg) ![image-20210516153031596](/images/posts/image-20210516153031596.png)