环境概览

操作系统

Ubuntu Server 20.04.3 LTS 64 bit 操作系统

部署的版本

软件 版本 获取方法
OpenJDK 1.8.0_312 sudo apt update
sudo apt install openjdk-8-jdk
ZooKeeper 3.4.6 在ZooKeeper官网下载所需版本的软件包。
下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
Hadoop 3.1.3 在Hadoop官网下载所需版本的软件包。
下载地址:https://archive.apache.org/dist/hadoop/core/hadoop-3.1.3/hadoop-3.1.3.tar.gz
Flink 1.14.4 在Flink官网下载所需版本的软件包。
下载地址:https://archive.apache.org/dist/flink/flink-1.14.4/flink-1.14.4-bin-scala_2.12.tgz

集群环境规划

机器名称 IP地址 硬盘数
node01 IPaddress1 系统盘:1 * 1000 GB 性能型本地盘
node02 IPaddress2
node03 IPaddress3
node04 IPaddress4
node05 IPaddress5

软件规划

机器名称 服务名称
node01 + NameNode
+ SecondaryNameNode
+ ResourceManager

+ JournalNode
+ NodeManager
+ QuorumPeerMain
+ DataNode
node02 + JournalNode
+ NodeManager
+ QuorumPeerMain
+ DataNode
node03 + JournalNode
+ NodeManager
+ QuorumPeerMain
+ DataNode
node04 + JournalNode
+ NodeManager
+ QuorumPeerMain
+ DataNode
node05 + JournalNode
+ NodeManager
+ QuorumPeerMain
+ DataNode

配置部署环境

依次登录节点 1-5,将节点的主机名分别修改为 node01node02node03node04、node05

  1. hostnamectl set-hostname 主机名 --static

登录所有节点,修改“/etc/hosts”文件

  1. vi /etc/hosts
在 hosts 文件中添加集群所有节点的“地址-主机名”映射关系。
  1. IPaddress1 node01
  2. IPaddress2 node02
  3. IPaddress3 node03
  4. IPaddress4 node04
  5. IPaddress5 node05

登录所有节点,关闭防火墙

  • 关闭防火墙
  1. sudo ufw disable
  • 查看防火墙状态
  1. sudo ufw status

登录所有节点,配置 SSH 免密登录

  • 生成密钥,遇到提示时,按回车
  1. ssh-keygen -t rsa
  • 在每台机器上配置 SSH 免密登录(包括配置自身节点的免密)
  1. ssh-copy-id -i ~/.ssh/id_rsa.pub root@节点IP
  • 或者将所有节点的 ~/.ssh/id_rsa.pub 的密钥拷贝到 ~/.ssh/authorized_keys 文件中
  1. cat ~/.ssh/id_rsa.pub
  2. vim ~/.ssh/authorized_keys

登录所有节点,安装 OpenJDK

  • 安装 OpenJDK
  1. sudo apt update
  2. sudo apt install openjdk-8-jdk
  • 查看 Java 安装位置
  1. sudo which java
  2. /usr/lib/jvm/java-8-openjdk-amd64/bin/java
  • 打开配置文件
  1. vi /etc/profile
  • 添加环境变量
  1. export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  2. export PATH=$JAVA_HOME/bin:$PATH
  • 使环境变量生效
  1. source /etc/profile
  • 查看已安装 Java 版本
  1. java -version
  2. openjdk version "1.8.0_312"
  3. OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07)
  4. OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

部署 ZooKeeper

下载并安装 ZooKeeper

  • 下载并解压 ZooKeeper
  1. wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
  2. mv zookeeper-3.4.6.tar.gz /usr/local
  3. cd /usr/local
  4. tar -zxvf zookeeper-3.4.6.tar.gz
  • 建立软链接,便于后期版本更换
  1. ln -s zookeeper-3.4.6 zookeeper

添加 ZooKeeper 到环境变量

  • 打开配置文件
  1. vi /etc/profile
  • 添加 Hadoop 到环境变量
  1. export ZOOKEEPER_HOME=/usr/local/zookeeper
  2. export PATH=$ZOOKEEPER_HOME/bin:$PATH
  • 使环境变量生效
  1. source /etc/profile

修改 ZooKeeper 配置文件

  • 修改配置文件
  1. cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
  2. vi /usr/local/zookeeper/conf/zoo.cfg
  1. - <font style="color:rgb(37, 43, 58);">修改数据目录。dataDir=</font>/usr/local/zookeeper/tmp
  2. - 配置 zookeeper 服务<font style="color:rgb(37, 43, 58);">,其中 server.1-5是部署 ZooKeeper 的节点</font>

server.1=node01:2888:3888

server.2=node02:2888:3888

server.3=node03:2888:3888

server.4=node04:2888:3888

server.5=node05:2888:3888

  1. # the directory where the snapshot is stored.
  2. dataDir=/usr/local/zookeeper/tmp
  3. # Place the dataLogDir to a separate physical disc for better performance
  4. # dataLogDir=/disk2/zookeeper
  5. # the port at which the clients will connect
  6. clientPort=2181
  7. # specify all zookeeper servers
  8. # The fist port is used by followers to connect to the leader
  9. # The second one is used for leader election
  10. server.1=node01:2888:3888
  11. server.2=node02:2888:3888
  12. server.3=node03:2888:3888
  13. server.4=node04:2888:3888
  14. server.5=node05:2888:3888
  • 创建 zookeeper 数据目录
  1. mkdir /usr/local/zookeeper/tmp
  • 在数据目录中创建一个空文件,并根据上面的配置向该文件写入 ID,node01 写入 1,node02 写入 2,node03 写入 3,node04 写入 4,node05 写入 5
  1. server.1=node01:2888:3888
  2. server.2=node02:2888:3888
  3. server.3=node03:2888:3888
  4. server.4=node04:2888:3888
  5. server.5=node05:2888:3888

如果未创建 myid 会报错:

./zkServer.sh start-foreground

ZooKeeper JMX enabled by default

Using config: /etc/zookeeper/conf/zoo.cfg

Invalid config, exiting abnormally

node01

  1. touch /usr/local/zookeeper/tmp/myid
  2. echo 1 > /usr/local/zookeeper/tmp/myid

node02

  1. touch /usr/local/zookeeper/tmp/myid
  2. echo 2 > /usr/local/zookeeper/tmp/myid

node03

  1. touch /usr/local/zookeeper/tmp/myid
  2. echo 3 > /usr/local/zookeeper/tmp/myid

node04

  1. touch /usr/local/zookeeper/tmp/myid
  2. echo 4 > /usr/local/zookeeper/tmp/myid

node05

  1. touch /usr/local/zookeeper/tmp/myid
  2. echo 5 > /usr/local/zookeeper/tmp/myid

验证 ZooKeeper

  • 分别在 node01,node02,node03,node04,node05 上启动 ZooKeeper
  1. cd /usr/local/zookeeper/bin
  2. ./zkServer.sh start
  • 分别在 node01,node02,node03,node04,node05 上查看 ZooKeeper 状态
  1. ./zkServer.sh status
  • 分别在 node01,node02,node03,node04,node05 上停止 ZooKeeper
  1. ./zkServer.sh stop

部署 Hadoop

下载并安装 Hadoop

  • 下载并解压 Hadoop
  1. wget https://archive.apache.org/dist/hadoop/core/hadoop-3.1.3/hadoop-3.1.3.tar.gz
  2. mv hadoop-3.1.3.tar.gz /usr/local
  3. cd /usr/local
  4. tar -zxvf hadoop-3.1.3.tar.gz
  • 建立软链接,便于后期版本更换
  1. ln -s hadoop-3.1.3 hadoop

添加 Hadoop 到环境变量

  • 打开配置文件
  1. vi /etc/profile
  • 添加 Hadoop 到环境变量
  1. export HADOOP_HOME=/usr/local/hadoop
  2. export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
  • 使环境变量生效
  1. source /etc/profile

修改 Hadoop 配置文件

切换到 Hadoop 配置文件目录

  1. cd $HADOOP_HOME/etc/hadoop

修改 hadoop-env.sh

修改环境变量 JAVA_HOME 为绝对路径,并将用户指定为 root
  1. echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> hadoop-env.sh
  2. echo "export HDFS_NAMENODE_USER=root" >> hadoop-env.sh
  3. echo "export HDFS_SECONDARYNAMENODE_USER=root" >> hadoop-env.sh
  4. echo "export HDFS_DATANODE_USER=root" >> hadoop-env.sh

修改 yarn-env.sh

修改用户为 root
  1. echo "export YARN_REGISTRYDNS_SECURE_USER=root" >> yarn-env.sh
  2. echo "export YARN_RESOURCEMANAGER_USER=root" >> yarn-env.sh
  3. echo "export YARN_NODEMANAGER_USER=root" >> yarn-env.sh

修改 core-site.xml

  • 编辑 core-site.xml 文件
  1. echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  2. <?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
  3. <configuration>
  4. <property>
  5. <name>fs.defaultFS</name>
  6. <value>hdfs://node01:9000</value>
  7. </property>
  8. <property>
  9. <name>hadoop.tmp.dir</name>
  10. <value>/data/hadoop/tmp</value>
  11. </property>
  12. <property>
  13. <name>ipc.client.connect.max.retries</name>
  14. <value>100</value>
  15. </property>
  16. <property>
  17. <name>ipc.client.connect.retry.interval</name>
  18. <value>10000</value>
  19. </property>
  20. <property>
  21. <name>hadoop.proxyuser.root.hosts</name>
  22. <value>*</value>
  23. </property>
  24. <property>
  25. <name>hadoop.proxyuser.root.groups</name>
  26. <value>*</value>
  27. </property>
  28. </configuration>
  29. " > core-site.xml

:::info

  • fs.defaultFS:默认文件系统的名称
  • hadoop.tmp.dir:本地数据存储目录

:::

  • 在节点 node01 上创建目录
  1. mkdir -p /data/hadoop/tmp

修改 hdfs-site.xml

  • 编辑 hdfs-site.xml 文件
  1. echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  2. <?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
  3. <configuration>
  4. <property>
  5. <name>dfs.replication</name>
  6. <value>3</value>
  7. </property>
  8. <property>
  9. <name>dfs.namenode.name.dir</name>
  10. <value>file:///data/hadoop/dfs/name</value>
  11. </property>
  12. <property>
  13. <name>dfs.datanode.data.dir</name>
  14. <value>file:///data/hadoop/dfs/data</value>
  15. </property>
  16. <property>
  17. <name>dfs.http.address</name>
  18. <value>node01:50070</value>
  19. </property>
  20. <property>
  21. <name>dfs.namenode.http-bind-host</name>
  22. <value>0.0.0.0</value>
  23. </property>
  24. <property>
  25. <name>dfs.datanode.handler.count</name>
  26. <value>600</value>
  27. </property>
  28. <property>
  29. <name>dfs.namenode.handler.count</name>
  30. <value>600</value>
  31. </property>
  32. <property>
  33. <name>dfs.namenode.service.handler.count</name>
  34. <value>600</value>
  35. </property>
  36. <property>
  37. <name>ipc.server.handler.queue.size</name>
  38. <value>300</value>
  39. </property>
  40. <property>
  41. <name>dfs.webhdfs.enabled</name>
  42. <value>true</value>
  43. </property>
  44. </configuration>
  45. " > hdfs-site.xml

:::info

  • dfs.replication:hdfs 分片数
  • dfs.namenode.name.dir:name 文件的存储位置
  • dfs.datanode.data.dir:data 文件的存储位置
  • dfs.blocksize:块大小
  • dfs.namenode.secondary.http-address:secondary 的http的地址

:::

  • 在所有节点上创建 dfs.datanode.data.dir 对应目录
  1. mkdir -p /data/hadoop/dfs

修改 mapred-site.xml

  • 编辑 mapred-site.xml 文件
  1. echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  2. <?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
  3. <configuration>
  4. <property>
  5. <name>mapreduce.framework.name</name>
  6. <value>yarn</value>
  7. <final>true</final>
  8. <description>The runtime framework for executing MapReduce jobs</description>
  9. </property>
  10. <property>
  11. <name>mapreduce.job.reduce.slowstart.completedmaps</name>
  12. <value>0.88</value>
  13. </property>
  14. <property>
  15. <name>mapreduce.application.classpath</name>
  16. <value>
  17. /usr/local/hadoop/etc/hadoop,
  18. /usr/local/hadoop/share/hadoop/common/*,
  19. /usr/local/hadoop/share/hadoop/common/lib/*,
  20. /usr/local/hadoop/share/hadoop/hdfs/*,
  21. /usr/local/hadoop/share/hadoop/hdfs/lib/*,
  22. /usr/local/hadoop/share/hadoop/mapreduce/*,
  23. /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
  24. /usr/local/hadoop/share/hadoop/yarn/*,
  25. /usr/local/hadoop/share/hadoop/yarn/lib/*
  26. </value>
  27. </property>
  28. <property>
  29. <name>mapreduce.map.memory.mb</name>
  30. <value>6144</value>
  31. </property>
  32. <property>
  33. <name>mapreduce.reduce.memory.mb</name>
  34. <value>6144</value>
  35. </property>
  36. <property>
  37. <name>mapreduce.map.java.opts</name>
  38. <value>-Xmx5530m</value>
  39. </property>
  40. <property>
  41. <name>mapreduce.reduce.java.opts</name>
  42. <value>-Xmx2765m</value>
  43. </property>
  44. <property>
  45. <name>mapred.child.java.opts</name>
  46. <value>-Xmx2048m -Xms2048m</value>
  47. </property>
  48. <property>
  49. <name>mapred.reduce.parallel.copies</name>
  50. <value>20</value>
  51. </property>
  52. <property>
  53. <name>yarn.app.mapreduce.am.env</name>
  54. <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  55. </property>
  56. <property>
  57. <name>mapreduce.map.env</name>
  58. <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  59. </property>
  60. <property>
  61. <name>mapreduce.reduce.env</name>
  62. <value>HADOOP_MAPRED_HOME=\${HADOOP_HOME}</value>
  63. </property>
  64. </configuration>
  65. " > mapred-site.xml

修改 yarn-site.xml

  • 编辑 yarn-site.xml 文件
  1. echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  2. <?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>
  3. <configuration>
  4. <property>
  5. <name>yarn.nodemanager.aux-services</name>
  6. <value>mapreduce_shuffle</value>
  7. <final>true</final>
  8. </property>
  9. <property>
  10. <name>yarn.resourcemanager.hostname</name>
  11. <value>node01</value>
  12. </property>
  13. <property>
  14. <name>yarn.resourcemanager.bind-host</name>
  15. <value>0.0.0.0</value>
  16. </property>
  17. <property>
  18. <name>yarn.resourcemanager.am.max-attempts</name>
  19. <value>10</value>
  20. <description>
  21. The maximum number of application master execution attempts.
  22. </description>
  23. </property>
  24. <property>
  25. <name>yarn.scheduler.maximum-allocation-mb</name>
  26. <value>65536</value>
  27. </property>
  28. <property>
  29. <name>yarn.nodemanager.resource.memory-mb</name>
  30. <value>102400</value>
  31. </property>
  32. <property>
  33. <name>yarn.nodemanager.resource.cpu-vcores</name>
  34. <value>48</value>
  35. </property>
  36. <property>
  37. <name>yarn.log-aggregation-enable</name>
  38. <value>true</value>
  39. </property>
  40. <property>
  41. <name>yarn.client.nodemanager-connect.max-wait-ms</name>
  42. <value>300000</value>
  43. </property>
  44. <property>
  45. <name>yarn.nodemanager.vmem-pmem-ratio</name>
  46. <value>7.1</value>
  47. </property>
  48. <property>
  49. <name>yarn.nodemanager.vmem-check-enabled</name>
  50. <value>false</value>
  51. </property>
  52. <property>
  53. <name>yarn.nodemanager.pmem-check-enabled</name>
  54. <value>false</value>
  55. </property>
  56. <property>
  57. <name>yarn.scheduler.minimum-allocation-mb</name>
  58. <value>3072</value>
  59. </property>
  60. <property>
  61. <name>yarn.app.mapreduce.am.resource.mb</name>
  62. <value>3072</value>
  63. </property>
  64. <property>
  65. <name>yarn.scheduler.maximum-allocation-vcores</name>
  66. <value>48</value>
  67. </property>
  68. <property>
  69. <name>yarn.application.classpath</name>
  70. <value>
  71. /usr/local/hadoop/etc/hadoop,
  72. /usr/local/hadoop/share/hadoop/common/*,
  73. /usr/local/hadoop/share/hadoop/common/lib/*,
  74. /usr/local/hadoop/share/hadoop/hdfs/*,
  75. /usr/local/hadoop/share/hadoop/hdfs/lib/*,
  76. /usr/local/hadoop/share/hadoop/mapreduce/*,
  77. /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
  78. /usr/local/hadoop/share/hadoop/yarn/*,
  79. /usr/local/hadoop/share/hadoop/yarn/lib/*
  80. </value>
  81. </property>
  82. <property>
  83. <name>yarn.nodemanager.local-dirs</name>
  84. <value>/data/hadoop/yarn/local</value>
  85. </property>
  86. <property>
  87. <name>yarn.nodemanager.log-dirs</name>
  88. <value>/data/hadoop/yarn/log</value>
  89. </property>
  90. </configuration>
  91. " > yarn-site.xml
  • 在所有节点上创建 yarn.nodemanager.local-dirs 对应目录
  1. mkdir -p /data/hadoop/yarn

修改 workers

  • 修改 workers 文件,只保存所有主机名,其余内容均删除
  1. echo "node01
  2. node02
  3. node03
  4. node04
  5. node05
  6. " > workers
  • 在所有节点上创建 journaldata 目录
  1. mkdir -p /usr/local/hadoop/journaldata

启动 Hadoop 集群

  1. 在所有节点上启动 ZooKeeper
  1. cd /usr/local/zookeeper/bin
  2. ./zkServer.sh start

:::color4

只在第一次进行格式化操作时,需要执行 2-4,完成格式化后,下次启动集群,只需要执行1、5、6

:::

  1. 启动 JournalNode
在所有节点上启动 JournalNode
  1. cd /usr/local/hadoop/sbin
  2. ./hadoop-daemon.sh start journalnode
观察进程是否都正常启动
  1. root@node01:~# jps
  2. 2270886 Jps
  3. 23529 QuorumPeerMain
  4. 26494 JournalNode
  1. 格式化 NameNode
在 node01 节点上格式化 NameNode bash hdfs namenode -format 格式化后集群会根据 core-site.xml 配置的 hadoop.tmp.dir 参数生成目录,配置目录为“/data/hadoop/tmp

:::info 解决 Apache Hadoop 启动时 DataNode 没有启动的问题(注意这会删除 HDFS 中原有的所有数据)-云社区-华为云

Hadoop namenode重新格式化需注意问题_火玄子的博客-CSDN博客

Hadoop重新格式化HDFS的方法 - 猎手家园 - 博客园

:::

  1. 格式化 ZooKeeper
在 node01 节点上格式化 ZooKeeper
  1. hdfs zkfc -formatZK

:::info HDFS ZKFC实现NameNode自动切换原理 - 腾讯云开发者社区-腾讯云

:::

  1. 启动 HDFS,在 node01 节点上启动 HDFS
  1. cd /usr/local/hadoop/sbin
  2. ./start-dfs.sh
  1. 启动 Yarn,在 node01 节点上启动 Yarn
  1. cd /usr/local/hadoop/sbin
  2. ./start-yarn.sh
观察进程是否都正常启动
  1. root@node01:~# jps
  2. 27043 NameNode
  3. 2270886 Jps
  4. 28965 ResourceManager
  5. 29174 NodeManager
  6. 23529 QuorumPeerMain
  7. 28715 SecondaryNameNode
  8. 27260 DataNode
  9. 26494 JournalNode
  1. root@node02:~# jps
  2. 26896 NodeManager
  3. 25746 JournalNode
  4. 26099 DataNode
  5. 2153387 Jps
  6. 22878 QuorumPeerMain

验证 Hadoop

在浏览器中输入URL地址,访问 Hadoop Web 页面,URL格式为“http://node01:50070”。 通过观察 Live Nodes 是否为 5、Dead Nodes是否为 0,判断集群是否正常启动。

Flink On Yarn 部署指南 - 图1

部署 Flink

下载并安装 Flink

  • 下载并解压 Flink
  1. wget https://archive.apache.org/dist/flink/flink-1.14.4/flink-1.14.4-bin-scala_2.12.tgz
  2. mv flink-1.14.4-bin-scala_2.12.tgz /usr/local
  3. cd /usr/local
  4. tar -zxvf flink-1.14.4-bin-scala_2.12.tgz
  • 建立软链接,便于后期版本更换
  1. ln -s flink-1.14.4 flink

添加 Flink 到环境变量

  • 打开配置文件
  1. vi /etc/profile
  • 添加 Flink 到环境变量
  1. export FLINK_HOME=/usr/local/flink
  2. export PATH=$FLINK_HOME/bin:$PATH
  3. export HADOOP_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
  • 使环境变量生效
  1. source /etc/profile

验证 Flink

  • 依次启动 ZooKeeper 和 Hadoop
  • 切换到 flink 安装路径
  1. cd $FLINK_HOME
  • 在 node01 上启动 Flink 集群
  1. ./bin/yarn-session.sh --detached

此时会返回一个 application-id,同时也会返回 JobManager Web Interface: http://node04:38677

  • 在浏览器中输入 URL 地址,访问 Flink Web 页面,URL 格式如下所示

Flink On Yarn 部署指南 - 图2

  • 提交 job(在启动 flink 集群的节点上提交)
  1. ./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
  • 取消运行的 job
  1. ./bin/flink cancel $JOB_ID
  • 停止 Flink 集群
  1. echo "stop" | ./bin/yarn-session.sh -id application_XXXXX_XXX

参考文档

Flink 部署指南(CentOS 7.6&openEuler 20.03)鲲鹏BoostKit大数据使能套件部署指南(Apache)_华为云