环境概览

操作系统

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,将节点的主机名分别修改为 node01、node02、node03、node04、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 文件中 ```bash cat ~/.ssh/id_rsa.pub

vim ~/.ssh/authorized_keys

  1. <a name="c1sKZ"></a>
  2. ## 登录所有节点,安装 OpenJDK
  3. - 安装 OpenJDK
  4. ```bash
  5. sudo apt update
  6. 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 ```bash wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

mv zookeeper-3.4.6.tar.gz /usr/local cd /usr/local tar -zxvf zookeeper-3.4.6.tar.gz

  1. - 建立软链接,便于后期版本更换
  2. ```bash
  3. 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 配置文件

  • 修改配置文件 ```bash cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

vi /usr/local/zookeeper/conf/zoo.cfg

  1. - 修改数据目录。dataDir=/usr/local/zookeeper/tmp
  2. - 配置 zookeeper 服务,其中 server.1-5是部署 ZooKeeper 的节点
  3. server.1=node01:2888:3888<br />server.2=node02:2888:3888<br />server.3=node03:2888:3888<br />server.4=node04:2888:3888<br />server.5=node05:2888:3888
  4. ```bash
  5. # the directory where the snapshot is stored.
  6. dataDir=/usr/local/zookeeper/tmp
  7. # Place the dataLogDir to a separate physical disc for better performance
  8. # dataLogDir=/disk2/zookeeper
  9. # the port at which the clients will connect
  10. clientPort=2181
  11. # specify all zookeeper servers
  12. # The fist port is used by followers to connect to the leader
  13. # The second one is used for leader election
  14. server.1=node01:2888:3888
  15. server.2=node02:2888:3888
  16. server.3=node03:2888:3888
  17. server.4=node04:2888:3888
  18. 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 ```bash wget https://archive.apache.org/dist/hadoop/core/hadoop-3.1.3/hadoop-3.1.3.tar.gz

mv hadoop-3.1.3.tar.gz /usr/local cd /usr/local tar -zxvf hadoop-3.1.3.tar.gz

  1. - 建立软链接,便于后期版本更换
  2. ```bash
  3. 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
  • 在节点 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
  • 在所有节点上创建 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

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

  2. 启动 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. 格式化 HDFS

在 node01 节点上格式化 HDFS

  1. hdfs namenode -format

格式化后集群会根据 core-site.xml 配置的 hadoop.tmp.dir 参数生成目录,配置目录为“/data/hadoop/tmp”

解决 Apache Hadoop 启动时 DataNode 没有启动的问题(注意这会删除 HDFS 中原有的所有数据)

  1. 格式化ZKFC

在 node01 节点上格式化 ZKFC

  1. hdfs zkfc -formatZK
  1. 启动 HDFS,在 node01 节点上启动 HDFS

    1. cd /usr/local/hadoop/sbin
    2. ./start-dfs.sh
  2. 启动 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,判断集群是否正常启动。
    image.png

    部署 Flink

    下载并安装 Flink

mv flink-1.14.4-bin-scala_2.12.tgz /usr/local cd /usr/local tar -zxvf flink-1.14.4-bin-scala_2.12.tgz

  1. - 建立软链接,便于后期版本更换
  2. ```bash
  3. 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 格式如下所示

image.png

  • 提交 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

参考文档