Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop 实现了一个分布式文件系统( Distributed File System),其中一个组件是 HDFS(Hadoop Distributed File System)。HDFS 有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS 放宽了(relax)POSIX 的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop 的框架最核心的设计就是:HDFS 和 MapReduce。HDFS 为海量的数据提供了存储,而 MapReduce 则为海量的数据提供了计算。
提前准备
系统
- CPU虚拟化:已启用
安装
- 运行虚拟机的工具:VMware (激活密钥:MC60H-DWHD5-H80U9-6V85M-8280D)
- SSH 工具:FinalShell
下载
配置模板虚拟机
安装虚拟机
- 虚拟机配置:处理器1C 内存1G 硬盘30G
网络设置
开始前可以使用 ip addr 查看虚拟机的 IP,然后使用 SSH 工具连接虚拟机方便后续配置信息的修改。
修改镜像源到国内
安装 Linux 必备工具
安装
1
2
3
4
5#CentOS
yum install -y curl wget vim zip sudo rsync openssh-server openssh-clients
#Debian
apt install -y curl wget vim zip sudo rsync
关闭防火墙
查看防火墙的状态
1
systemctl status firewalld.service
关闭防火墙
1
systemctl stop firewalld.service
关闭防火墙自动启动
1
systemctl disable firewalld.service
开启防火墙
1
systemctl start firewalld.service
开启防火墙自动启动
1
systemctl enable firewalld.service
静态 IP 配置
备份网络配置文件
1
2
3
4
5# CentOS
sudo cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
# Debian
sudo cp /etc/network/interfaces /etc/network/interfaces.bak编辑网络配置文件
1
2
3
4
5# CentOS
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33
# Debian
sudo vim /etc/network/interfacesCentOS 参考配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5a646ee0-bc7e-4793-83b9-1784f237c07d"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.10.102
GATEWAY=192.168.10.2
NETMASK=255.255.255.0
DNS1=114.114.114.114Debian 参考配置:
1
2
3
4
5
6
7
8
9
10
11# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug ens33
iface ens33 inet static
address 192.168.10.100
netmask 255.255.255.0
gateway 192.168.10.2
nameserver 114.114.114.114
修改主机名称
编辑 hostname 文件
1
sudo vim /etc/hostname
修改主机名称映射
编辑 hosts 文件
1
sudo vim /etc/hosts
参考配置:
1
2
3
4
5
6
7
8127.0.0.1 localhost
127.0.1.1 hadoop100
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104重启使配置生效
1
reboot
因为设置了静态 IP,所以 SSH 工具中的主机 IP 也需要对应修改。
查看是否生效
1
2
3
4
5#查看 IP
ip addr
#查看主机名
hostname
权限设置
允许 root 用户以 SSH 方式登录
1
2#使用 vim 编辑 sshd_config 文件
sudo vim /etc/ssh/sshd_config找到下面这一段:
1
#PermitRootLogin prohibit-password
修改成下面这一段,注意前面的 # 号需要去掉:
1
PermitRootLogin yes
然后重启 SSH 服务:
1
sudo service sshd restart
配置普通用户具有 root 权限,方便后期使用 sudo 执行 root 权限的命令
1
2#使用 vim 编辑 sudoers 文件
sudo vim /etc/sudoers找到下面这一段:
1
%wheel ALL=(ALL) ALL
在它的下面添加一行:
1
2<username> ALL=(ALL) NOPASSWD:ALL
#替换 <username> 为你自己的用户名参考配置:
1
2
3
4
5
6
7
8
9
10
11
12## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
克隆虚拟机
- 以上步骤完成后关闭虚拟机,然后进行克隆,克隆方法选择创建完整克隆
- 克隆三台名为 hadoop102 到 hadoop104 的虚拟机
- 分别修改 hadoop102 到 hadoop104 的静态 IP 地址和主机名称
SSH 连接
修改 Windows 主机映射文件
1
2
3
4
5修改此路径中的 hosts 文件
C:\Windows\System32\drivers\etc\
Windows7 用户可以直接修改此文件
Windows10 用户需要复制此文件到其他位置修改,然后再覆盖原始的文件参考配置:
1
2
3
4
5
6
7#将如下内容添加到 hosts 文件最后
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104使用 FinalShell 添加 SSH 连接
1
2
3
4
5
6
7
8
9
10
11名称:hadoop102 (可自定义)
主机:hadoop102
端口:22
名称:hadoop103 (可自定义)
主机:hadoop103
端口:22
名称:hadoop104 (可自定义)
主机:hadoop104
端口:22
安装 JDK & Hadoop
首先在 hadoop102 上安装,后续可以使用 scp 和 rsync 命令复制或同步到 hadoop103、hadoop104。
创建安装目录
1 | #创建安装目录 |
使用 SSH 工具上传压缩包到 /opt/software 目录中
解压
注意:如果下载的版本不一样,压缩包名称也会不一样,自行修改。
1 | tar -zxvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module |
配置环境变量
1 | #生成 my_env.sh 文件进行编辑 |
参考配置:
1 | #JAVA_HOME |
更新环境变量
1 | source /etc/profile |
验证环境变量是否生效
1 | #查看版本 |
scp & rsync 命令
定义
- scp 可以实现服务器与服务器之间的数据拷贝 (from server1 to server2)
- rsync 主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点
- 差异:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新,scp 是把所有文件都复制过去
基本语法
scp
1
2
3
4
5
6
7scp -r $pdir/$fname $user@$host:$pdir/$fname
$pdir/$fname #表示要拷贝的文件路径/名称
$user@$host:$pdir/$fname #表示目的地的用户@主机:目的地路径/名称
#带参数 -r 表示拷贝目录,不带 -r 则拷贝文件rsync
1
2
3
4rsync -av $pdir/$fname $user@$host:$pdir/$fname
#参数 -a 表示归档模式,表示以递归方式传输文件,并保持所有文件属性
#参数 -v 显示过程
实操
scp
1
2
3
4
5#将 hadoop102 中的 /opt/module 拷贝到 hadoop103 上
scp -r /opt/module hadoop@hadoop103:/opt
#从 hadoop102 中拷贝 /opt/module 到 hadoop103 上
scp -r hadoop@hadoop102:/opt/module /optrsync
1
2#同步 hadoop102 和 hadoop103 中的 /opt/module/hadoop-3.1.4
rsync -av /opt/module/hadoop-3.1.4 hadoop@hadoop103:/opt/module/hadoop-3.1.4
xsync 分发脚本
1 | #在 /bin 目录下生成 xsync 文件并编辑 |
参考配置:
1 |
|
1 | #让 xsync 具有可执行权限 |
1 | #使用 xsync 分发环境变量 |
1 | #然后在每台主机上运行以下命令更新环境变量 |
SSH 免密登录
1 | #分别在 hadoop102、hadoop103、hadoop104 中创建 ssh 密钥 |
1 | #查看 ssh 密钥 |
1 | #分别将公钥拷贝到 hadoop102、hadoop103、hadoop104 中 |
集群配置
集群部署规划
注意:NameNode 和 SecondaryNameNode 不要安装在同一台服务器上。ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台服务器上
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN | NodeManager |
ResourceManager NodeManager |
NodeManager |
自定义配置文件
core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 四个配置文件都存放在 $HADOOP_HOME/etc/hadoop 这个目录下,用户可以根据项目需求重新进行修改配置。
核心配置
1 | vim $HADOOP_HOME/etc/hadoop/core-site.xml |
参考配置:
1 | <configuration> |
HDFS 配置
1 | vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml |
参考配置:
1 | <configuration> |
YARN 配置
1 | vim $HADOOP_HOME/etc/hadoop/yarn-site.xml |
参考配置:
1 | <configuration> |
MapReduce 配置
1 | vim $HADOOP_HOME/etc/hadoop/mapred-site.xml |
参考配置:
1 | <configuration> |
workers 配置
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
1 | vim $HADOOP_HOME/etc/hadoop/workers |
参考配置:
1 | hadoop102 |
分发配置文件
1 | xsync $HADOOP_HOME/etc/hadoop |
群起集群
启动集群
如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode
注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格化。
1
hdfs namenode -format
在 hadoop102 上启动 HDFS
1
start-dfs.sh
在 hadoop103 上启动 YARN
1
start-yarn.sh
查看运行状态
1
jsp
报错解决办法
Hadoop 提示 ERROR: Attempting to operate on yarn resourcemanager as root 的解决方法
在 start-dfs.sh 和 stop-dfs.sh 文件的顶部添加以下参数:
1 | HDFS_DATANODE_USER=root |
在 start-yarn.sh 和 stop-yarn.sh 文件的顶部添加以下参数:
1 | YARN_RESOURCEMANAGER_USER=root |
集群奔溃处理办法
停止集群
1
stop-dfs.sh
删除 data 和 logs 目录
注意:每台服务器上的 data 和 logs 目录都需要删除
1
rm -rf $HADOOP_HOME/data $HADOOP_HOME/logs
格式化集群
1
hdfs namenode -format
启动集群
1
start-dfs.sh
两个常用脚本
集群启停脚本
1 | #在 /bin 目录下生成 xsync 文件并编辑 |
参考配置:
1 |
|
1 | #让 myhadoop 具有可执行权限 |
查看 Java 进程脚本
1 | #在 /bin 目录下生成 xsync 文件并编辑 |
参考配置:
1 |
|
1 | #让 jpsall 具有可执行权限 |