一、基本概念

1.计算机的一些概念

  • 计算机系统可以粗糙的分成三个层次:底层系统,中间层,应用层

  • 底层系统,也叫系统内核(kernel),如Linux/UNIX、Windows NT(Windows New Technology)

  • 中间层是shell层,叫命令解释层,是底层系统与用户交互的界面;

    • 有图形化的shell:如Windows Explorer;

    • 命令行shell:如command、cmd.exe、PowerShell

2.Hadoop组成

  • Hadoop 1.x:MapReduce,HDFS,COMMON
  • Hadoop 2.x:MapReduce,Yarn,HDFS,COMMON
    • 分别为:计算、资源调度、数据存储、辅助工具
  • 2.x版本是将1.x的MapReduce拆成两部分

2.1 HDFS架构

  • NameNode(NN):类似目录、索引
  • DataNode(DN):存数据的地方,可以分到各个硬盘里面
  • Secondary NameNode(2NN):监控整个HDFS架构的程序,NN报废了,2NN并不能恢复NN

2.2 Yarn架构

  • 用来调用CPU、内存资源等

  • Resource Manager(RM):只有一个,用来处理客户端请求、监控NodeManager、启动或监控ApplicationMaster、资源的分配与调度

  • NodeManager(NM):管理单个节点的资源、处理RM的命令、处理ApplicationMaster的命令
  • ApplicationMaster:负责任务,即Job的整个生命周期:与NM通信,监控Job的所有状态
  • Container:容器,封装了CPU、内存、网络、磁盘等资源

2.3 MapReduce

  • 分Map、Reduce两个阶段,是Hadoop开发的重点

二、安装虚拟机

1.准备软件

2.安装虚拟机

  • 安装VMware15,注意15.5.5的版本有点bug,大小写失灵。建好虚拟机后,在vmx的文件中加入mks.win32.useInjectedMagic = "FALSE"就可以解决

  • 这里先建立一台名为hadoop的虚拟机,配置好文件,作为备份,然后再对这台虚拟机copy

1
2
3
4
#在hadoop虚拟机里关闭防火墙
systemctl stop firewalld.service
#关闭防火墙自启动
systemctl disable firewalld.service
  • 在root用户下创建两个文件夹
1
2
3
mkdir /opt/software /opt/module
# 把权限给user,可以改成自己的用户名
chown user:user /opt/software /opt/module
  • 给user用户超级权限,以后使用user这个用户来操作
1
2
3
vim /etc/sudoers
# 加入下面这句话
user ALL=(ALL) NOPASSWD:ALL
  • 更改host,方便以后集群互项认识
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看IP地址,其实是看不到的
ip addr
# 更改设置
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 将ONBOOT改成yes
# 重启网络,注意,centos8的命令如下
sudo nmcli c reload
ip addr
# 查到的ip为192.168.184.133/24
# 更改hosts,为了方便对应,就建立了下面三个hadoop
sudo vim /etc/hosts
192.168.184.133 hadoop
192.168.184.134 hadoop104
192.168.184.135 hadoop105
192.168.184.136 hadoop106
  • 改静态IP,免得重启后IP换了,hosts失效
1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
# 改成下面的内容
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.184.133 # 每加一台虚拟机,这个IP要改
PREFIX=24
GATEWAY=192.168.184.2 # 这个IP在编辑、虚拟网络设置、更改设置、NAT设置里看
DNS1=192.168.184.2 # 与上面一致
NAME=eth0
  • 改主机名
1
2
sudo vim /etc/sysconfig/network
HOSTNAME=hadoop # 另外三台叫hadoop104、105、106
  • 使用VMware快照,克隆出三台虚拟机hadoop104、105、106,分别改IP、主机名

  • 准备分发脚本

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
scp -r hadoop:/opt/module/hadoop-3.1.3 hadoop104:/opt/module
rsync -av hadoop:/opt/module/jdk1.8.0_151 /opt/module
# 或者使用分发脚本
#! /bin/bash
#1 获取输入参数个数
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo frame=$fname
#3 获取上级
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名
user=`whoami`
#5 循环
for((host=104;host<107;host++)); do
echo hadoop$host
rsync -av $pdir/$fname $user@hadoop$host:$pdir
done

# 在主目录下创建xsync脚本,copy上面的脚本内容
vim xsync
chmod +x xsync
sudo cp xsync /bin
# 将xsync分发到三个机器上
./xsync xsync
  • 配置SSH,方便以后分发东西和使用notepad++来编辑内容。SSH,secure shell,安全外壳协议,非对称加密实现身份验证
1
2
3
4
5
# 生成SSH
ssh-keygen -t rsa
# 发送密钥
ssh-copy-id hadoop104
xsync .ssh

3.集群配置

  • 集群的配置规划
    • HDFS有NN、DN、2NN
    • YARN有RM、NM
    • 真实情况下,DN和NM是在同一台机器上的(共三个节点、即三台机器)
    • NN、2NN、RM各自一台机器,所以需要六台机器
    • 但是六台虚拟机所需要的内存太大了,所以把NN、2NN、RM分配到下面三台机器
    • 其中hadoop虚拟机不用了
hadoop104 hadoop105 hadoop106
HDFS DN、NN DN DN、2NN
YARN NM NM、RM NM
  • 接着安装JAVA和Hadoop,同样的,我现在hadoop虚拟机上进行
1
2
3
4
# 将hadoop-2.10.0.tar.gz和jdk-8u151-linux-x64.tar.gz复制到/opt/software
# 解压,安装在opt的module里
tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt/module
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module
  • 配置环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
sudo vim /etc/profile
# 添加以下六行
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_151
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 保存
source /etc/profile
# 检测
hadoop version
java -version
  • 安装好之后,将上面的东西分发到集群中的机器中去

4.hadoop配置

  • 集群要配置以下几个文件
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
43
44
45
46
47
48
49
50
51
52
53
54
# core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop104:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data/tmp</value>
</property>
</configuration>
# hdfs-site.xml
<configuration>
<!--指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hdoop辅助名称节点主机配置,即2NN -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop106:50090</value>
</property>
</configuration>
# mapred-stie.xml
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framewor.name</name>
<value>yarn</value>
</property>
</configuration>
# yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- YARN获取资源的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop105</value>
</property>
</configuration>
# hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_151
# mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_151
# yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_151
  • 配置DataNode和NodeManager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Hadoop在3.0之后将slaves改成workers了
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim workers
# 改成
hadoop104
hadoop105
hadoop106
# 群起备份
xsync workers
# 格式化NameNode
hadoop namenode -format
# 在NN的机器上启动集群,即hadoop104
start-dfs.sh
# 在RM的机器上启动YARN,即hadoop105
start-yarn.sh
# 或者使用简单语句
start-all.sh
stop-all.sh
  • 配置历史服务器、日志群集
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
# 在mapred-site.xml里加入
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop106:10020</value>
</property>
<!-- 历史服务器端web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop106:19888</value>
</property>
# 在yarn-site.xml里加入
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
# 在hadoop106上启动
mr-jobhistory-daemon.sh start historyserver
mr-jobhistory-daemon.sh stop historyserver
# 在网页端查看
http://192.168.184.136:19888/jobhistory
  • 修改完之后,记得将配置分发到每一台机器中去。

5.集群时间同步

  • 集群时间同步,让所有机器的时间一致

6.maven

  • 解压maven包
1
tar -zxvf apache-maven-3.0.5-bin.tar.gz  -C /opt/module/
  • 配置镜像源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 在/opt/module/apache-maven-3.0.5/conf/settings.xml里面
# 加入
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
  • 配置profile
1
2
3
#MAVEN HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin

7.ant

  • 安装ant
1
tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
  • 环境变量
1
2
3
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin

8.安装glibc等

1
2
3
4
[root@hadoop101 apache-ant-1.9.9]# yum install glibc-headers
[root@hadoop101 apache-ant-1.9.9]# yum install gcc-c++
[root@hadoop101 apache-ant-1.9.9]# yum install make
[root@hadoop101 apache-ant-1.9.9]# yum install cmake
  • 解压protobuf
1
2
3
4
5
6
7
[root@hadoop101 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
[root@hadoop101 opt]# cd /opt/module/protobuf-2.5.0/
[root@hadoop101 protobuf-2.5.0]#./configure
[root@hadoop101 protobuf-2.5.0]# make
[root@hadoop101 protobuf-2.5.0]# make check
[root@hadoop101 protobuf-2.5.0]# make install
[root@hadoop101 protobuf-2.5.0]# ldconfig
  • 环境变量
1
2
3
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH

9.hdoop启动

  • 注意,每次开机后一定要格式化namenode
1
hadoop namenode -format
  • 启动
1
start-all.sh
  • 关闭
1
stop-all.sh
  • 如果namenode挂了,其他节点的东西也一样
1
hadoop-daemon.sh start namenode
  • 如果发现resourcemanage没有启动,要么手动启动,要么修改start-all.sh代码,第三种方法就是在RM的机器上执行start-all.sh