服务器存储环境准备

服务器硬件规格如下

  • 服务器rios-cad2:7T空硬盘*1

  • 服务器rios-cad6-121:7TB空硬盘*1。
  • 服务器rios-cad6-122:7TB空硬盘*1。

首先需要对空硬盘进行分区、格式化文件系统、挂载。

分区

先介绍两种分区表:

  • MBR分区表:(MBR含义:主引导记录)
    • 所支持的最大卷:2TB
    • 对分区的设限:最多4个主分区或3个主分区加一个扩展分区
  • GPT分区表:(GPT含义:GUID分区表)
    • 支持最大卷:18EB(1EB=1024TB)
    • 每个磁盘最多支持128个分区

因此,当磁盘超过2TB时,我们要么将磁盘分为多个MBR分区,否则需要使用GBT分区。

Linux传统的分区工具fdisk不支持GPT分区,但可以使用另一个工具parted来对GPT磁盘操作。parted功能很强大,既可用命令行也可以用于交互式。注意:parted只可以对没有做过任何分区的空盘做分区。

这里我们只对硬盘(编号/dev/sda)分1个分区,因此我们使用parted工具来实现GPT分区。

$ sudo parted /dev/sda
NU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

可以输入p打印磁盘信息,查看分区的情况,找到起始和结束位置。

(parted) p
error: /dev/sda: unrecognised disk label
Model: ATA INTEL SSDSC2KG07 (scsi)
Disk /dev/sda: 7682GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:

发现此时硬盘的信息全部为空。接下来我们设定使用的分区类型, 如果要用MBR分区,输入msdos即可。

(parted) mklabel gpt                                                      
(parted) p
Model: ATA INTEL SSDSC2KG07 (scsi)
Disk /dev/sda: 7682GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags

可以看到,此时硬盘已经被标记为gpt分区了。接下来将所有空间都划分到一个分区中。

(parted) mkpart primary 0% 100%

primary指分区类型为主分区,0是分区开始位置,100%是分区结束位置。相同的命令为:

(parted) mkpart primary 0-1

接下来可以查看一下分区情况:

(parted) p                                                                
Model: ATA INTEL SSDSC2KG07 (scsi)
Disk /dev/sda: 7682GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 7682GB 7681GB primary

可以看到此时文件系统还是空的,输入q保存并退出。

(parted) q                                                                
Information: You may need to update /etc/fstab.

当在系统里创建了一个新的分区后,因为mount挂载在重启服务器后会失效,所以这个提示的意思是我们需要将分区信息写到/etc/fstab文件中让其永久挂载。

最后我们可以再检查一下分区的结果:

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 7T 0 disk
└─sda1 8:1 0 7T 0 part
sdb 8:16 0 7T 0 disk
sdc 8:32 0 7T 0 disk
sdd 8:48 0 7T 0 disk
sde 8:64 0 7T 0 disk
sdf 8:80 0 446.6G 0 disk
├─sdf1 8:81 0 200M 0 part /boot/efi
├─sdf2 8:82 0 1G 0 part /boot
└─sdf3 8:83 0 445.4G 0 part
├─centos-root 253:0 0 100G 0 lvm /
├─centos-swap 253:1 0 16G 0 lvm [SWAP]
└─centos-apps 253:2 0 329.4G 0 lvm /apps

可以看到/dev/sda已经有一个分区/dev/sda/sda1了,其大小为7T。

格式化文件系统

格式化文件系统使用的命令是mkfs

现代Linux系统支持多种不同的文件系统:如EXT3、EXT4、XFS、BTRFS,等等。针对特定的工作负载,这些文件系统具有略微不同的差别。如果追求性能的稳定性以及高级特性,那么可以使用EXT3,它在最大型的Hadoop集群中已经得到了测试。完整的列表请参见http://wiki.apache.org/hadoop/DiskSetup。在这里我们将使用EXT4,因为它在大型文件中有着更为出众的表现,这点使它成为了优秀的Hadoop文件系统之一。

$ mkfs -t ext4 /dev/sda1

如果想要使用ext3可按如下操作。

mkfs -t ext3 /dev/sdb1

格式化成ext3的时候会出现另一个问题:ext3默认的block size的大小为4k,最大只能支持8T的空间,因此我们需要在格式化时指定block size的大小为8K,这样才可以最大支持16T的空间。

mkfs -t ext3 -b 8192 /dev/sdb1

挂载

挂载到/home目录下

mount /dev/sda1 /apps/big-data/

最后,因为新分区的mount挂载在重启服务器后会失效,我们需要进行自动挂载分区配置。

首先获取磁盘的UUID。

$ blkid /dev/sda1
/dev/sda1: UUID="a24b38e3-4bf4-4e11-9369-4e55a58120fd" TYPE="ext4" PARTLABEL="primary" PARTUUID="9e68d663-5c65-4f03-8df4-3c4621a91881"

然后修改fstab文件来实现开机自动挂载。

vim /etc/fstab 
UUID=2de0edf4-ece6-4f9a-b65e-75f338c0f7d6 /apps/big-data ext4 defaults 0 0

至此,我们的硬件环境准备就算大功告成了。

搭建Hadoop集群

我们这里采用的软件版本如下:

  • 从AdoptJDK下载的OpenJDK8U-jdk_x64_linux_hotspot_8u372b07.tar.gz
  • 从官网下载的hadoop-3.2.4.tar.gz

其他环境如下:

  • Hadoop配置文件所在目录:etc/hadoop
  • 配置参数并不是只有下文的那些,很多没配置都是官方默认的参数
  • 默认参数查看方式:hadoop.apache.org/docs/3.2.4 划到最底下左下角有个Configuration模块

一、主节点hadoop-env.sh 文件

cd /apps/big-data/hadoop/etc/hadoop
vim hadoop-env.sh

配置JAVA_HOME,找到文件中被注释掉的那行:

export JAVA_HOME=/apps/big-data/java/jdk8u372-b07

配置HADOOP_HOME:

export HADOOP_HOME=/apps/big-data/hadoop

设置用户以执行对应角色shell命令,只有设置了HDFS和YARN集群各角色的用户,一键启停脚本才能使用

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

二、主节点core-site.xml文件

  • 参数fs.defaultFS:配置默认的文件系统,file:/// 就是本地文件系统; hdfs:// 是hadoop分布式文件系统。
  • 参数hadoop.tmp.dir:Hadoop各种临时数据的存放处。
  • 参数hadoop.http.staticuser.user:在Web UI访问HDFS使用的用户名,涉及到文件访问权限,如果不是root用户,有些目录可能无法访问。
cd /apps/big-data/hadoop/etc/hadoop
vim core-site.xml

在文件末尾的两个configuration之间插入

    <!-- 在Web UI访问HDFS使用的用户名。-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>

<configuration>
<!-- 默认文件系统的名称。通过URI中schema区分不同文件系统。-->
<!-- file:///本地文件系统 hdfs:// hadoop分布式文件系统 gfs://。-->
<!-- hdfs文件系统访问地址:http://nn1:9870。-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn1.hadoop.rioslab.org:9870</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/apps/big-data/hadoop/tmp</value>
</property>
</configuration>

三、主节点hdfs-site.xml文件

  • 参数dfs.namenode.secondary.http-address:设置SecondaryNameNode角色运行的主机,配置了之后,一键启停脚本才知道在哪台服务器上启动SecondaryNameNode
cd /apps/big-data/hadoop/etc/hadoop
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///apps/big-data/hadoop/persistent/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///apps/big-data/hadoop/persistent/dfs/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>mn1.hadoop.rioslab.org:9872</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>mn1.hadoop.rioslab.org:9871</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>

四、主节点mapred-site.xml文件

  • 配置MapReduce程序的一些参数
  • 参数mapreduce.framework.name:mr程序默认运行方式。yarn集群模式 local本地模式,执行mr程序时,如果不指定运行方式,就会使用这个参数配置的方式,这里不配置的话,官方默认的是local本地模式
  • 参数yarn.app.mapreduce.am.env:MR App Master环境变量
  • 参数mapreduce.map.env:MR MapTask环境变量
  • 参数mapreduce.reduce.env:MR ReduceTask环境变量
  • HADOOP_HOME这个环境变量配置bin目录的父文件夹即可
cd /apps/big-data/hadoop/etc/hadoop
vim mapred-site.xml
<configuration>
<!-- mr程序默认运行方式。yarn集群模式 local本地模式-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- Default jobhistory properties -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>

<!-- MR App Master环境变量。-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR MapTask环境变量。-->
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR ReduceTask环境变量。-->
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>

五、主节点yarn-site.xml文件

  • 配置YARN集群的一些参数
  • 参数yarn.resourcemanager.hostname:yarn集群主角色RM运行的机器,一键启停时知道在哪启动ResourceManager
  • 参数yarn.nodemanager.aux-services:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MR程序,否则报错
  • 参数yarn.scheduler.minimum-allocation-mb:每个容器请求的最小内存资源(以MB为单位)
  • 参数yarn.scheduler.maximum-allocation-mb:每个容器请求的最大内存资源(以MB为单位)
  • 参数yarn.nodemanager.vmem-pmem-ratio:容器虚拟内存与物理内存之间的比率,配置为4时,表示每有1G的物理内存,就可以使用4G的虚拟内存
  • 虚拟内存:物理内存不够时,使用磁盘来计算,虽然速度慢,但是也能计算
cd /apps/big-data/hadoop/etc/hadoop
vim yarn-site.xml
<configuration>
<!-- yarn集群主角色RM运行机器。-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nn1.hadoop.rioslab.org</value>
</property>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MR程序。-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 每个容器请求的最小内存资源(以MB为单位)。-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!-- 每个容器请求的最大内存资源(以MB为单位)。-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器虚拟内存与物理内存之间的比率。-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
</configuration>

六、主节点workers文件

  • 配置从角色所在的服务器,一键启停时,会遍历workers文件,挨个机器启动从角色(DataNode、NodeManager)
cd /apps/big-data/hadoop/etc/hadoop
vim workers
sn1.hadoop.rioslab.org
sn2.hadoop.rioslab.org

hosts文件配置如下:

10.8.6.2   mn1.hadoop.rioslab.org mn1
10.8.6.121 sn1.hadoop.rioslab.org sn1
10.8.6.122 sn2.hadoop.rioslab.org sn2

启动Hadoop集群

依次输入命令向数据各节点复制Hadoop配置文件:

scp -r etc/hadoop/ root@sn1:/apps/big-data/hadoop/etc/
scp -r etc/hadoop/ root@sn2:/apps/big-data/hadoop/etc/

格式化namenode

需要在Hadoop 安装目录下的 bin 目录里的 hdfs 命令进行格式化。

./hdfs namenode -format

启动Hadoop和检测

启动Hadoop集群。以下命令需要在sbin/文件夹中进行

./start-dfs.sh(HDFS 集群)
./start-yarn.sh(Yarn 集群)
./mr-jobhistory-daemon.sh start historyserver(日志服务)

输入后利用jps对主节点和从节点检查。最后进入web界面查看监控:

  • http://mn1.hadoop.rioslab.org:9871(查看 HDFS 集群监控)

  • http://mn1.hadoop.rioslab.org:19888(查看 YARN 集群监控)

关闭集群

同样需要在sbin目录下进行

./stop-dfs.sh(HDFS 集群)
./stop-yarn.sh(Yarn 集群)
./mr-jobhistory-daemon.sh stop historyserver(日志服务)

到这里我们的Hadoop集群就已经搭建完成。

参考资料[1]:https://blog.csdn.net/Spark_BITZH/article/details/127461423

参考资料[2]:https://juejin.cn/post/7174570294126837773