hadoop-HDFS集群部署
HDFS集群部署
本篇笔记使用的Hadoop版本为3.4.1,下载链接hadoop-3.4.1.tar.gz。
根据前面的笔记,部署HDFS的3台虚拟机配置如下:
节点 | CPU | 内存 | 服务 |
---|---|---|---|
node1 | 1 core | 4GB | NameNode, DataNode, SecondaryNameNode |
node2 | 1 core | 2GB | DataNode |
node3 | 1 core | 2GB | DataNode |
Hadoop HDFS的角色包含:
- NameNode,主节点管理者
- DataNode,从节点工作者
- SecondaryNameNode,主节点辅助
前置准备工作
我们将使用node1
作为NameNode主节点,将会部署更多的软件。本质上,HDFS的三种角色都是作为进程运行在主机上。hadoop-3.4.1.tar.gz安装包中包含了3种角色的程序,我们将其上传到node1
中,配置好node1
后,我们将其再scp
到node2
,node3
上。具体操作步骤(以node1
为例,以root
用户操作)如下:
1# 1. 上传Hadoop安装报到node1节点中,本人使用的是MobaXterm直接上传,并切换到上传所在目录
2# 2. 解压缩安装包到/export/server中
3tar -zxvf hadoop-3.4.1.tar.gz -C /export/server
4
5# 3. 构建软连接方便操作
6cd /export/server
7ln -s /export/server/hadoop-3.4.1 /export/server/hadoop
8
9# 进入hadoop安装包准备安装
10cd hadoop
Hadoop 主要配置
Hadoop文件下基本由以下文件:
1[root@node1 hadoop]# ls -l
2total 84
3drwxr-xr-x 2 1024 1024 203 Oct 10 00:36 bin # 存放Hadoop的各类程序(命令)
4drwxr-xr-x 3 1024 1024 20 Oct 9 22:59 etc # 存放Hadoop的配置文件
5drwxr-xr-x 2 1024 1024 106 Oct 10 00:36 include # C语言的一些头文件
6drwxr-xr-x 3 1024 1024 20 Oct 10 00:36 lib # 存放Linux系统的动态链接库
7drwxr-xr-x 4 1024 1024 288 Oct 10 00:36 libexec # 存放配置Hadoop系统的脚本文件(.sh,.cmd)
8-rw-rw-r-- 1 1024 1024 23759 Sep 17 04:47 LICENSE-binary # 存放许可证文件
9drwxr-xr-x 2 1024 1024 4096 Oct 10 00:36 licenses-binary
10-rw-rw-r-- 1 1024 1024 15696 Jul 16 03:54 LICENSE.txt
11-rw-rw-r-- 1 1024 1024 27165 Jul 16 03:54 NOTICE-binary
12-rw-rw-r-- 1 1024 1024 1541 Jul 16 03:54 NOTICE.txt
13-rw-rw-r-- 1 1024 1024 175 Jul 16 03:54 README.txt
14drwxr-xr-x 3 1024 1024 4096 Oct 9 22:59 sbin # 管理员程序
15drwxr-xr-x 4 1024 1024 31 Oct 10 01:09 share # 存放二进制源码(java jar包)
其中,我们常用的有bin
,etc
,sbin
三个文件夹中的程序。在配置阶段,主要是etc
文件中的配置修改,其中和HDFS修改的配置文件主要有:
1[root@node1 hadoop]# ls -l workers hadoop-env.sh core-site.xml hdfs-site.xml
2-rw-r--r-- 1 1024 1024 774 Oct 9 22:57 core-site.xml
3-rw-r--r-- 1 1024 1024 16786 Oct 10 00:36 hadoop-env.sh
4-rw-r--r-- 1 1024 1024 775 Oct 9 23:03 hdfs-site.xml
5-rw-r--r-- 1 1024 1024 10 Oct 9 22:57 workers
ps: 在/etc文件夹中,.sh
是Linux使用的配置文件,.cmd
是Windows使用的配置文件。因此,会看到类似hadoop-env.sh
,hadoop-env.cmd
这样同名不同后缀的一对文件。.xml
是通用的数据文件格式,JAVA语言喜欢用这个文件格式。.properties
是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名。
下面我们具体介绍四个和HDFS密切相关的配置文件。
-
workers::记录集群中存在哪些从节点(DataNode)
填入DataNode的IP或主机名(可DNS解析时),一行一个 e.g
-
hadoop-env.sh:配置hadoop运行的环境变量。找到文件中对应项,并修改。
-
core-site.xml:配置集群全局参数,用于定义系统级别的参数,如HDFS、URL、Hadoop的临时目录等。数据格式为name-value.
1<configuration> 2 <property> 3 <!--HDFS文件系统的网络通信路径--> 4 <!--通讯协议:hdfs://, namenode:node1, 通信端口8020--> 5 <!--表明DataNode将和node1的8020端口通讯, node1是NameNode所在机器--> 6 <name>fs.defaultFS</name> 7 <value>hdfs://node1:8020</value> 8 </property> 9 10 <property> 11 <!--io操作文件缓冲区大小 131072 bit--> 12 <name>io.file.buffer.size</name> 13 <value>131072</value> 14 </property> 15</configuration>
xml -
hdfs-site.xml:HDFS参数。如名称节点和数据节点的存放位置、文件副本的个数、文件读取权限等。
1<configuration> 2 <property> 3 <!--hdfs文件系统,默认创建的文件权限设置,默认700, rwx --> 4 <name>dfs.datanode.data.dir.perm</name> 5 <value>700</value> 6 </property> 7 <property> 8 <!--NameNode元数据的存储位置,在node1节点的/data/nn 目录下--> 9 <name>dfs.namenode.name.dir</name> 10 <value>/data/nn</value> 11 </property> 12 <property> 13 <!--NameNode允许哪几个节点的DataNode连接,即允许加入集群--> 14 <name>dfs.namenode.hosts</name> 15 <value>node1,node2,node3</value> 16 </property> 17 <property> 18 <!--hdfs默认块大小,默认256MB--> 19 <name>dfs.blocksize</name> 20 <value>268435456</value> 21 </property> 22 <property> 23 <!--namenode处理的并发数线程数,默认100--> 24 <name>dfs.namenode.handler.count</name> 25 <value>100</value> 26 </property> 27 <property> 28 <!--从节点DataNode的数据目录存储目录,即数据存放在各个node的位置--> 29 <name>dfs.datanode.data.dir</name> 30 <value>/data/dn</value> 31 </property> 32 <property> 33 <name></name> 34 <value></value> 35 </property> 36</configuration>
xml总之,
namenode
数据存放在node1
的/data/nn
,datanode
数据存放在node1
,node2
,node3
的/data/dn
。
然后,我们将配置好的Hadoop程序从node1
复制到node2
,node3
。
1# 从node1 scp复制
2cd /export/server
3scp -r hadoop-3.4.1 node2:/export/server/
4scp -r hadoop-3.4.1 node3:/export/server/
5
6# node2,node3上同样创建软链接
7ln -s /export/server/hadoop-3.4.1 /export/server/hadoop
复制完成之后,我们在3个节点上都添加Hadoop环境变量
1vim /etc/profile
2
3# 在/etc/profile文末添加如下内容
4export HADOOP_HOME=/export/server/hadoop
5export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
6
7# 使环境变量生效
8source /etc/profile
接下来,我们依据配置文件创建文件夹并更改拥有者。
1# node1
2mkdir -p /data/nn
3mkdir /data/dn
4chown -R hadoop:hadoop /data
5chown -R hadoop:hadoop /export
6
7# node2, node3
8mkdir -p /data/dn
9chown -R hadoop:hadoop /data
10chown -R hadoop:hadoop /export
接下来,我们都可以用普通用户hadoop来启动整个Hadoop服务。
Hadoop HDFS初始化
我们开始使用HDFS时,首先要对整个文件系统执行初始化(格式化)。注:我们现在以hadoop
用户来执行了命令。
1# 确保以hadoop用户执行
2su - hadoop
3# 格式化namenode
4hadoop namenode -format
5
6# 格式化成功后,/data/nn中会有一些文件
7cd /data/nn && ls
8current
9ls current/
10fsimage_0000000000000000000 fsimage_0000000000000000000.md5 seen_txid VERSION
格式化之后我们可以采用快捷脚本一键启动/关闭集群
1# 启动
2[hadoop@node1 nn]$ start-dfs.sh
3Starting namenodes on [node1]
4Starting datanodes
5node3: WARNING: /export/server/hadoop/logs does not exist. Creating.
6node2: WARNING: /export/server/hadoop/logs does not exist. Creating.
7Starting secondary namenodes [node1]
8
9# 通过jps查看目前运行的java进程
10[hadoop@node1 nn]$ jps
1120101 DataNode
1219946 NameNode
1320394 SecondaryNameNode
1420524 Jps
15
16# 一键启动脚本,还会自动启用其他DataNode,查看node2,node3的进程:
17[hadoop@node2 ~]$ jps
1817296 Jps
1917177 DataNode
20
21[hadoop@node3 ~]$ jps
2217207 DataNode
2317307 Jps
24
25
26# 停止
27[hadoop@node1 nn]$ stop-dfs.sh
启动完成之后,Hadoop在NameNode所在的服务器上,提供了一个网站服务器,默认启动在9870端口。如果能打开网站,并且其中信息大概没错,HDFS的集群部署就大概完成了。
Figure 1: hadoop-HDFS-website
保存状态
虚拟机快照,防止误操作。具体步骤:
1# 关闭hadoop集群
2[hadoop@node1 nn]$ stop-dfs.sh
3Stopping namenodes on [node1]
4Stopping datanodes
5Stopping secondary namenodes [node1]
6[hadoop@node1 nn]$ jps
721701 Jps
8
9# 关闭虚拟机
10su - root
11shutdown -h now
12
13# 虚拟机操作拍摄快照
拍摄好快照后,我们的虚拟机快照状态如下:
Figure 2: hadoop-HDFS-快照
总结
- 上传、解压到
/export/server
,配置软链接 - 修改4份配置文件:
workers
,hadoop-env.sh
,core-site.xml
,hdfs-site.xml
- 分发的
node2
,node3
,并设置环境变量 - 创建数据目录,并修改文件权限归属hadoop账户
- 启动,并查看Web UI
- 附下图问题省流自查。
Figure 3: hadoop-HDFS-配置自查