之前讲解了 Hadoop 安装。这篇文章讲解运行模式以及配置。
Hadoop 有 3 种运行模式,分别是单机模式、伪分布式模式、完全分布式模式。本文以 ubantu 18.04 和 Hadoop 2.10.1 为例。
单机模式
这篇文章中讲解了 Hadoop 的安装和环境设置。当安装完成后,Hadoop 就是默认的单机模式。
在单机模式下使用的是本地文件系统,而不是分布式文件系统,Hadoop 不会启动守护进程,不用修改配置文件,避免了复杂的配置工作,用于对 MapReduce 程序逻辑进行调试。
伪分布式模式
用一台主机模拟多台主机的运行环境。每个守护进程都以 Java 进程的形式运行,可以检查内存使用情况,HDFS 输入输出,以及其他的守护进程。
这种模式主要适用于单机调试。
配置并启动 HDFS
要配置的文件都在 Hadoop 的 etc/hadoop/ 目录下。
cd /opt/hadoop/etc/hadoop/
- hadoop-env.sh
删除掉导入 Java 环境的前的注释符,并修改环境变量路径。
export JAVA_HOME=/opt/jdk1.8.0_311
- core-site.xml
用于设置 Hadoop 集群的特性,作用于全部进程和客户端。
找到配置文件所在文件夹,用超级用户权限进行修改。默认情况下配置文件都是空的,增加以下内容。
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.10.1/data/tmp</value>
</property>
</configuration>
- hdfs-site.xml
配置 hdfs 集群工作属性。超级用户权限编辑 hdfs-site.xml,主要用于指定数据块中集群副本个数。
<configuration>
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- 格式化和启动
转到 hadoop 安装目录。
cd /opt/hadoop-2.10.1
对 hadoop 文件系统进行格式化。
bin/hdfs namenode -format
第一次使用的时候格式化就行,不要经常格式化。格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。所以,格式 NameNode 时,一定要先删除 data 数据和 log 日志,然后再格式化 NameNode。
格式化之前最好关掉正在运行的 NameNode 和 DataNode,并删除临时文件和日志文件,也即 data 目录和 log 目录。
启动 NameNode 和 DataNode。
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
上述两条命令也可以用下面这一条来代替,前提是配置了 SSH 免密登录。
sbin/start-dfs.sh
输入 jps
,如果出现 NameNode 和 DataNode,则表示成功。
jps
是 JDK 的命令。
也可以通过查看进程来验证。
ps -ef | grep -i dfs
如果没有成功,可以查看日志排除错误。日志保存在 logs/目录下。
用浏览器登录 http://localhost:50070/,可以看见文件系统的相关信息。
最后,把上述的 start
改为 stop
可以关闭服务,也可以采用下面的命令。
./stop-dfs.sh
配置并启动 YARN
- yarn-site.sh
删除掉导入 Java 环境的前的注释符,并修改环境变量路径。
export JAVA_HOME=/opt/jdk1.8.0_311
- yarn-site.xml
为 NodeManager 配置 MapReduce 应用 shuffle 服务。
<configuration>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemaneger.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
</configuration>
- mapred-env.sh
同样也是导入 Java 环境变量地址。
export JAVA_HOME=/opt/jdk1.8.0_311
- mapred-site.xml
复制一份 mapred-site.xml.template,命名为 mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml
配置 mapreduce 集群属性,应使用 YARN 框架。
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 启动
按照上一小节的方法的方法启动 NameNode 和 DataNode。再启动 ResourceManager 和 NodeManager。
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
上面两条命令可以用下面这一条命令来代替,前提是配置了 SSH 免密登录。
sbin/start-yarn.sh
使用 jps
命令,如果出现 ResourceManger 和 NodeManager 则成功。也可以通过查看进行来验证。
ps -ef | grep -i yarn
用浏览器登录 http://localhost:8088/,可以看到集群信息。
最后,把上述的 start
改为 stop
可以关闭服务,也可以采用下面的命令。
./stop-yarn.sh
在配置好后,可以按照这篇文章中的流程运行一个示例程序。
更详细的配置方法可以查看官网。
完全分布模式
运行在多台主集搭建的集群上,是真正的生产环境。所有主机都要安装 jdk 和 hadoop,且都要修改配置文件,并且配置 ssh 免密登录。
假设集群由 3 台主机组成,一台作为主节点,另外两台作为从节点。主机通过网络连接起来。
配置 IP 地址
在 VirtualBox 中,为了保证虚拟机能够正常上网,同时也保证这几个虚拟机的 IP 地址固定,我们给虚拟机设置两个网卡。第一个网卡连接方式设置为网络地址转换(NAT),这个网卡用于与互联网进行通信。另一个网卡连接方式设置为仅主机(Host-only)网络,用于虚拟机之间的通信。
转到 /etc/netplan 目录下,超级用户权限修改 01-network-manager-all.yaml 文件,配置使用 Host-Only 网卡的地址,以下代码配置为自己的 IP 地址就好。
networks:
ethernets:
enp0s8:
dhcp4: no
addresses: [192.168.101.11/24]
optional: true
gatway4: 192.168.101.1
由于设置了 2 个网卡,因此要通过 MAC 地址分清楚哪个网卡是用了 Host-Only 模式,才能进行配置。
修改之后,进行激活,并查看是否配置成功。
sudo netplay apply
ifconfig
同时,修改 /etc/hosts 添加映射。
192.168.101.11 master
192.168.101.12 slave1
192.168.101.13 slave2
另外 2 台主机也都进行这样的配置,要设置不同的 ip 地址。
SSH 免密登录
在 Hadoop 安装一文中提到了 SSH 免密登录。现在要求主节点可以免密登录从节点,因此略有不同,还需要把主节点上的密钥输入到节点机的授权列表中。
scp ~/.ssh/id_rsa.pub slave1@192.168.101.12:/home/slave1/.ssh
在从节点机上把密码要加授权列表。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
这样一来,主机可以免密登录从机。
ssh slave1
如果无法免密登录,可能是由于主机和从机中的用户名不同造成的,那么要在主机中修改 ~/.ssh/config 文件(没有该文件则创建)。
Host slave1
user slave1
Host slave2
use slave2
两台从节点上都要进行相同操作,并且也要把自己的公钥给主节点和其它从节点。
配置主节点
配置文件都在 hadoop 安装目录的 etc/hadoop 目录下。这里的配置与伪分布模式类似。
由于 NameNode、SecondaryNameNode 和 ResourceManager 非常消耗资源,因此我们把这三个分别放在不同的节点上面,分担各节点的压力。
- hadoop-env.sh
删除掉导入 Java 环境的前的注释符,并修改环境变量路径。
export JAVA_HOME=/opt/jdk1.8.0_311
- 修改 core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.10.1/data/tmp</value>
</property>
</configuration>
- hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
为了修改 SecondaryNameNode 的配置,还需要加上下面这个属性。这样的话 SecondaryNameNode 会在 cslave2 上启动,否则在主节点上。
<!-- 指定 Hadoop 辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>cslave2:50090</value>
</property>
- yarn-env.sh
删除掉导入 Java 环境的前的注释符,并修改环境变量路径。
export JAVA_HOME=/opt/jdk1.8.0_311
- yarn-site.xml
在这之中我们制定了 ResourceManager 的地址,如果不指定的话则是主节点。
<configuration>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>cslave1</value>
</property>
</configuration>
- mapred-env.sh
同样也是导入 Java 环境变量地址。
export JAVA_HOME=/opt/jdk1.8.0_311
- mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- slaves
把默认的 localhost 删掉,把主从节点都写入。
cmaster
cslave1
cslave2
不要有空格或空行。
配置从节点
一方面,需要把主节点的公钥复制到从节点上,并添加到从节点已授权列表中。上文已经讲解了。
另一方面,把 hadoop文件夹也复制到从节点上,配置文件也一起复制过去了。
scp -r /opt/hadoop cslave1@192.168.101.12:/tmp
scp -r /opt/hadoop cslave2@192.168.101.13:/tmp
由于权限原因,先复制到 /tmp 目录下,再移动到其它目录。
复制过来的文件记得要改所有者和所有者组。
sudo chown cslave1:cslave1 -R /opt/hadoop-2.10.1
更详细的配置方法及参数解释可以查看官网。
格式化并启动
- 格式化文件系统
在主节点上格式化文件系统。同样,只需要第一次使用的时候格式化。如果不是第一次使用,首先要删除 logs/ 和 data/ 目录,每个节点都要删除。
cd /opt/hadoop-2.10.1
bin/hdfs namenode -format
- 启动 NameNode 和 DataNode
在主节点 cmaster 上启动 NameNode 和 DataNode。
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
使用 jps
命令查看进程,在主节点 cmaster 上运行着 NameNode 和 DataNode,其它节点上没有运行程序。
在从节点 cslave1 和 cslave2 上启动 DataNode。
sbin/hadoop-daemon.sh start datanode
使用 jps
命令查看进程,在 cslave1 上运行着 DataNode。
在 cslave2 上还要启动 SecondaryNameNode。
sbin/hadoop-daemon.sh start secondarynamenode
使用 jps
命令查看进程,在 cslave2 上运行着 DataNode 和 SecondaryNameNode。这是由于我们之前在 hdfs-site.xml 上配置了 SecondaryNameNode。如果不做配置默认在主节点上。
上面启动 NameNode 和 DataNode 的命令可以用下面这一条来代替,前提是按照该上一小节的方式配置了 SSH 免密登录。
sbin/start-dfs.sh
这种方式更简便也更常用。
- 启动 YARN
由于我们之前修改了 yarn-site.xml,把 ResourceManager 设置在了 cslave1 上,因此我们要在 cslave1 中启动 YARN。如果不做这个修改,则在主节点上启动。
sbin/start-yarn.sh
输入 jps
查看,在各节点上可以看到新增加了 NodeManager,cslave1 上还增加了 ResourceManger。
- 验证、查看
上文用到了 jps
查看进程是否启动成功。还可以在浏览器中查看资源。
因为在 cmaster 上运行着 NameNode,因此输入 cmaster:50070/,能看到节点数目和文件系统。我们开了 3 个节点,因此能看到存活节点数为 3.
由于在 cslave2 上运行着 SecondaryNameNode,因此输入 cslave2:50090/ 能看到辅助节点的信息。
由于在 cslave1 上运行着 RecesourceManager,输入 cslave1:8088/,可以看到执行的任务信息。
- 停止服务
sbin/stop-yarn.sh
sbin/stop-dfs.sh