Apache Hadoop 完全分布式集群搭建
环境配置
Hadoop 框架是采用 Java 语言编写,需要 Java 环境 (jvm)
- JDK 版本:JDK8 版本
- 集群:使用 vmware 虚拟机虚拟三台 linux 节点,linux 操作系统: Centos7
- 虚拟机环境准备三台虛拟机 (静态 iP、关闭防火墙、修改主机名、配置兔密登录、集群时间同步)
首先创建一台虚拟机配置好 hadoop 环境变量后分别克隆出 slave1、slave2 节点
创建目录1
2mkdir /opt/software -- 软件安装包
mkdir /opt/servers -- 软件安装目录
集群规划
框架 | master | slave1 | slave2 |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | NodeManager | ResourceManager、NodeManager |
安装 JKD8
下载 jdk-8u202-linux-x64.tar.gz
至 /usr/java
目录1
2
3# 解压
cd /usr/java
tar -zxvf jdk-8u202-linux-x64.tar.gz
配置环境变量vim /etc/profile
1
2
3# JAVA
JAVA_HOME=/usr/java/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin1
2
3source /etc/profile
# 验证是否成功
java -version
- 关闭防火墙
1
2systemctl stop firewalld
systemctl disable firewalld
Hadoop
下载 Hadoop
下载 Hadoop 到 /opt/software
中1
wget -P /opt/software http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
解压 Hadoop 到 /opt/servers
中1
tar -zxvf /opt/software/hadoop-2.10.1.tar.gz -C /opt/servers
配置环境变量
添加环境变量到
vim /etc/profile
1
2
3
4# HADOOP
export HADOOP_HOME=/opt/servers/hadoop-2.10.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin使环境变量生效
1
source /etc/profile
修改配置文件
1
cd /opt/servers/hadoop-2.10.1/etc/hadoop
HDFS 配置 JDK 环境
1
vim hadoop-env.sh
使用
hadoop version
检查配置是否正常
目录结构
1 | drwxr-xr-x bin -- 对 hadoop 操作相关命令(.cmd为windows用) |
克隆节点
配置好以上环境后克隆出两台节点 slave1、slave2 并分配静态 IP。修改主机名
PS:需要在关机状态下克隆
修改本机静态 IP
修改本机 Hostname 并配置 SSH 免密登录
多台设备时间同步
集群规划实施
以下内容直到 集群分发配置 都是在 master 节点中配置
HDFS 集群配置
1 | cd /opt/servers/hadoop-2.10.1/etc/hadoop |
NameNode 节点及数据存储目录
master 节点
PS:配置信息一定要放在 configuration 标签中!
core-site.xml 默认配置在:
https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/core-default.xml1
vim core-site.xml
1
2
3
4
5
6
7
8
9
10<!-- 指定 HDFS 中的 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定 Hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/servers/hadoop-2.10.1/data/tmp</value>
</property>
SecondaryNameNode
hdfs-site.xml 默认配置
https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml1
vim hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:50090</value>
</property>
<!-- 指定副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
DataNode 从节点
1 | cd /opt/servers/hadoop-2.10.1/etc/hadoop |
将原来内容删除然后将需要启动 DatanNode 的节点主机名写入
PS:不要加主机名后面加空格,也不要多起一行
MapReduce 集群配置
配置 MapReduce JDK 路径
1 | vim mapred-env.sh |
解开 JAVA_HOME 注释并配置正确的 JAVA_HOME 路径
指定 MapReduce 计算框架运行 YARN 资源调度框架
因为只有模版文件 mapred-site.xml.template
所以需要复制一份出来改名为 mapred-site.xml
1
2cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
默认配置:https://hadoop.apache.org/docs/r2.10.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml1
2
3
4
5<!-- 指定 MapReduce 运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
Yarn 集群配置
配置 Yarn JDK 路径
1 | vim yarn-env.sh |
配置 ResourceManager
指定 ResourceManager 老大节点所在的计算机节点
slave2
1 | vim yarn-site.xml |
默认配置:https://hadoop.apache.org/docs/r2.10.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml1
2
3
4
5
6
7
8
9
10
11
12<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave2</value>
</property>
<!-- reduce 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
指定 NodeManager 从节点
如果已经配置 HDFS 的 DataNode 从节点 slave 配置文件 则不需要在修改了
这两个信息是一样的,共用同一个文件
权限注意
Hadoop 安装目录所属用户和所属用户组信息,默认是 1000 1000,而我们操作 Hadoop 集群的用户使用的是虚拟机的 root 用户,所以为了避免出现信息混乱,修改 Hadoop 安装目录所属用户和用户组!!1
2chown -R root:root /opt/servers/hadoop-2.10.1
ll /opt/servers/hadoop-2.10.1
分发配置
编写集群分发脚本 rsync-script
rsync 远程同步工具
rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快, rsync 只对差异文件做更新。scp 是把所有文件都复制
如果系统没有这个命令1
2yum -y install rsync
rsync --version
- 基本语法
命令 选项参数 要拷贝的文件路径 / 名称目的用户 @主机:目的路径 / 名称1
rsync -rvl $pdir/$fname $user@$host:$pdir/$fname
- 选项参数说明
选项 功能 -r 递归 -v 显示过程 -l 拷贝符号连接
集群分发脚本
期望:脚本 + 要同步的文件名称
说明:/usr/local/bin 中存在脚本,root 用户可以在任意地方执行
编写脚本
1
vim /usr/local/bin/rsync-script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#!/bin/bash
# 说明:循环复制文件到集群所有节点的相同目录下
# 1. 获取传入脚本的参数,参数个数
paramNum=$#
if ((paramNum == 0)); then
echo No Parameters!
exit
fi
# 2. 获取到文件名称
param1=$1 # 第一个参数
fileName=$(basename $param1) # 获取最后一个路径
# 3. 获取到文件的绝对路径
# 获取到上级目录,并以绝对路径方式进入,然后获取路径信息(解决传入相对路径问题)
$(cd -P $(dirname $param1))
dirName=$(pwd)
path=$dirName/$fileName # 文件路径
# 判断路径是否有效
if [ ! -f $fileName ] && [ ! -d $fileName ]; then
echo "$path" failed: No such file or directory
exit
fi
# 4. 获取到当前用户信息
username=$(whoami)
orginHost=slave # 主机名称前缀
# 由于主机名为master 所以需要在外面配置,如果你的linux主机名是有循序的,则不需要这一步
rsync -rvl $path ${username}@master:${dirName}
# 5. 执行 rsync 命令,循环执行同步到其他节点
for ((i = 1; i <= 2; i++)); do
echo ---- target host ${orginHost}${i}
echo ---- sync $path
rsync -rvl $path ${username}@${orginHost}${i}:${dirName}
done设置执行权限
1
chmod 777 /usr/local/bin/rsync-script
执行同步
PS:同步 hadoop 时如果 master 已经格式化 NameNode 请不要将 data 目录同步过去1
2cd /opt/servers
rsync-script hadoop-2.10.1
启动集群
注意:如果集群是第一次启动,需要在 NameNode 所在节点格式化 NameNode,非第一次不用执行格式化 NameNode 操作!如果多次格式化会造成无法启动!
格式化 NameNode 不能执行多次格式化1
2# master节点执行命令
hadoop namenode -format
格式化成功后会在 /opt/servers/hadoop-2.10.1/data/tmp 目录创建文件
配置 Window 主机 Host
在我的 window 中打开 C:\Windows\System32\drivers\etc
将对应 ip 和主机名添加进去1
2
3192.168.139.121 master
192.168.139.122 slave1
192.168.139.123 slave2
单节点启动
建议使用集群群起!!!
启动 master 的 NameNode 和 DataName
1
2
3
4hadoop-daemon.sh start namenode
jps
hadoop-daemon.sh start datanode
jps启动 slave1 和 slave2 的 DateName
1
2hadoop-daemon.sh start datanode
jps
PS:启动 NameNode 后可以在浏览器打开控制台 http://master:50070/ 主节点:50070
Yarn 集群单节点启动
建议使用集群群起
启动 Yarn 主节点
Yarn 集群放在了 slave2 上。所以需要在 slave2 进行操作
1 | yarn-daemon.sh start resourcemanager |
启动 NodeManager 从节点
master 、slave1、slave2 都启用从节点
1 | yarn-daemon.sh start nodemanager |
集群群起
** 如果已经单节点方式启动了 Hadoop,可以先停止之前的启动的 NameNode 与 DataNode 进程。如果之前 NameNode 没有执行格式化这里需要执行格式化,千万不要重复执行!!**1
hadoop namenode -format
启动 HDFS 集群
master 节点上执行1
start-dfs.sh
执行完毕后检查 master、slave1、slave2 的 NameNode、DataName、SecondaryNameNode 是否启动成功!
启动 Yarn 集群
ResourceManager 主节点在 slave2 节点,所以要上 slave2 节点执行1
start-yarn.sh
执行完毕后检查 master、slave1、slave2 的 ResourceManager、NodeManager 是否启动成功!
集群测试
HDFS 分部式存储
从 Linux 本地文件系统上传下载文件验证 HDFS 集群工作正常
1 | cd /root |
MapReduce 分布式计算
1 | vim /root/wc.txt |
1 | hadoop fs -mkdir /mapReduce |
- 回到 Hadoop 目录
/opt/servers/hadoop-2.10.1
- 执行官方示例程序 wordcount 单词统计
1 | hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /mapReduce /wcoutput |
也可以登录 Yarn 集群控制面板查看
控制面板安装在 resourceManager 的节点 http://slave2:8088/cluster
历史日志服务器
在 Yarn 中运行的任务产生的日志数据不能查看,为了查看程序的历史运行情况,需要配置一下历史日志服务器。
配置日志服务器
master 节点
- 配置 mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11<!-- 历史服务器地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 历史服务器web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property> - 分发 mapred-site.xml 到其他节点
1
rsync-script mapred-site.xml
- master 启动历史服务器
1
2mr-jobhistory-daemon.sh start historyserver
jps - 访问历史服务器
http://master:19889
配置日志的聚集
日志聚集:应用(job)运行完成以后,将应用运行日志信息从各个 task 汇总上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager、 ResourceManager 和 HistoryManager
- 配置 yarn-site.xml
1
vim /opt/servers/hadoop-2.10.1/etc/hadoop/yarn-site.xml
1
2
3
4
5
6
7
8
9
10<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property> - 分发 yarn-site.xml 到其他节点
1
rsync-script yarn-site.xml
- 停止 yarn 集群
slave2 节点1
2stop-yarn.sh
jps
- 重启 JobHistoryServer
master1
2
3mr-jobhistory-daemon.sh stop historyserver
mr-jobhistory-daemon.sh start historyserver
jps
- 启动 yarn 集群
slave2 节点
执行官方测试案例
- 删除之前执行生成的文件
1
hadoop fs -rm -r /wcoutput
- 执行
1
2
3/opt/servers/hadoop-2.10.1
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /mapReduce /wcoutput - 查看日志