第一章 Hadoop概述
1.1 Hadoop是什么
- Hadoop是一个由Apache基金会所开发的分布式系统基础架构
- 主要解决,海量数据的存储和海量数据的分析计算问题
- 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈
1.2 Hadoop优势
- 高可靠性:Hadoop底层维护多个数据副本,因此即使Hadoop某个计算元素或存储出现问题,也不会导致数据丢失
- 高扩展性:在集群间分配任务数据,可方便地扩展数以千计的节点
- 高效性:在MapReduce的思想下,Hadoop是并行工作的,可以加快任务处理速度
- 高容错性:能够自动将失败任务重新分配
1.3 Hadoop组成
构件 | 功能 |
---|---|
Common | 辅助工具 |
HDFS | 数据存储 |
Yarn | 资源调度 |
MapReduce | 计算 |
1.3.1 HDFS架构概述
HDFS, Hadoop Distributed File System, 是一个分布式文件系统
- NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限)以及每个文件的块列表和块所在的DataNode
- DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
- Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份
1.3.2 YARN架构概述
YARN, Yet Another Resource Negotiator, 另一种资源协调者,是Hadoop的资源管理器
- Container:容器,是Yarn对资源做的一层抽象,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等
- 容器由NodeManager启动和管理,并被它所监控
- 容器被ResourceManager进行调度
- ResourceManager(RM):整个集群资源(内存、CPU等)的老大,负责资源管理,整个系统有且只有一个RM,来负责资源的调度。其包含两个主要的组件:
- 定时调度器(Scheduler):从本质上来说,定时调度器就是一种策略,或者说一种算法。当 Client 提交一个任务的时候,它会根据所需要的资源以及当前集群的资源状况进行分配。
- 应用管理器(ApplicationManager):应用管理器就是负责管理 Client 用户提交的应用
- ApplicationMaster(AM):单个任务运行的老大。每当一个Client提交一个Application的时候,就会新建一个ApplicationMaster。由该AM向RM申请容器资源,获得资源后会将要运行的程序发送到容器上启动,然后进行分布式计算。
- NodeManager(NM):单个节点服务器资源的老大,即ResourceManager在每台机器上的代理,负责容器的管理,并监控他们的资源使用情况,以及向RM提供这些资源的使用报告。
1.3.3 MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
- Map阶段并行处理输入数据
- Reduce阶段对Map结果进行汇总
1.3.4 HDFS、YARN、MapReduce三者间的关系
第二章 Hadoop运行环境搭建
2.1 模板虚拟机准备
2.1.1 下载并安装VMware
2.1.2 CentOS
2.1.2.1 配置电脑
2.1.2.2 安装系统
按照如下顺序安装即可
- 时间选择上海时区
- 软件选择gnome界面安装
- 安装位置需要重点配置
- 按照自己需要配置分区
- 手动添加分区
- /boot —— 1G,修改为ext4文件系统
- swap —— 4G
- / —— 45G
- KDUMP关闭
- 网络打开,主机名重新修改
2.1.2.3 网络配置
需要配置的地方有三处:
- vmware虚拟机
- vmware网络编辑器——>更改设置——配置VMnet8子网IP地址
- NAT设置,配置网关IP地址
- win10系统
- 系统网络连接设置——>以太网更改适配器选项
- VMnet8——>勾选IPv4并双击,修改IP地址
- 系统IP
2.1.2.4 IP以及主机名称修改
vim /etc/sysconfig/network-script/ifcfg-ens33
- 修改BOOTPROTO="static"
- 添加IPADDR, GATEWAY, DNS1字段
vim /etc/hosts
- 添加主机名称映射(如192.168.10.100 hadoop100)
reboot
重启
2.1.3 远程终端工具安装
- xshell
- 编辑
C:\Windows\System32\drivers\etc
中的hosts文件,添加主机名称映射
- 编辑
- xftp
- windows和linux系统间通讯工具
远程登录hadoop100对虚拟机进行配置:
- windows和linux系统间通讯工具
- 安装epel-release
root@hadoop100 # yum install -y epel-release
- 关闭防火墙,关闭防火墙开机服务
root@hadoop100 # systemctl stop firewalld
root@hadoop100 # systemctl disable firewalld.service
- 配置atguigu用户具有root权限,方便后期加sudo执行root权限的命令
root@hadoop100 # vim /etc/sudoers
修改sudoers文件
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
atguigu ALL=(ALL) NOPASSWD:ALL
- 切换到普通用户,在/opt目录下创建文件夹,并修改所属主和所属组
atguigu@hadoop100 # sudo mkdir /opt/module
atguigu@hadoop100 # sudo mkdir /opt/sofrware
atguigu@hadoop100 # sudo chown atguigu:atguigu /opt/module
atguigu@hadoop100 # sudo chown atguigu:atguigu /opt/software
- 卸载虚拟机自带的JDK
root@hadoop100 # rpm -ga | grep -i java | xargs -n1 rpm -e--nodeps
- 重启虚拟机
atguigu@hadoop100 # reboot
2.2 克隆虚拟机
- 在VMware中克隆hadoop100
- 修改对应的虚拟机服务器ip地址和主机名称
root # vim /etc/sysconfig/network-script/ifcfg-ens33
root # vim /etc/hostname
2.3 在hadoop102安装JDK
- 利用xftp上传文件安装包到hadoop102
/opt/software
目录下 - 解压缩文件到指定目录
tar -zxvf 压缩文件 -C /opt/module
- 配置环境变量
- 新建
sudo vim /etc/profile.d/my_env.sh
文件
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH$JAVA_HOME/binsource /etc/profile
使新环境变量生效
- 新建
2.4 在hadoop102安装Hadoop
- 上传安装包(同上)
- 解压缩文件(同上)
- 配置环境变量
- 修改
sudo vim /etc/profile.d/my_env.sh
文件
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbinsource /etc/profile
使新环境变量生效
- 修改
2.5 Hadoop目录结构
- bin目录:存放对Hadoop相关服务(hdfs, yarn, mapred)进行操作的脚本
- etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
- lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
- sbin目录:存放启动或停止Hadoop相关服务的脚本
- share目录:存放Hadoop的依赖jar包、文档和官方案例
第三章 Hadoop运行模式
- 本地运行模式:单机运行。生产环境不使用
- 伪分布式模式:单机运行。具备Hadoop集群的所有功能,一台服务器模拟一个分布式环境。生产环境不使用
- 完全分布式模式:多台服务器组成分布式环境。生产环境使用
完全分布式安装步骤:
- 准备3台client(关闭防火墙、静态IP、主机名称)
- 安装JDK
- 配置环境变量
- 安装Hadoop
- 配置环境变量
- 配置集群
- 单点启动
- 配置ssh
- 启动并测试集群
3.1 虚拟机准备
参照第二章
3.2 编写集群分发脚本xsync
- 拷贝命令
scp -r user@server:sourcePlace user@server:destinationPlace
- rsync远程同步工具
rsync -av user@server:sourcePlace user@server:destinationPlace
- xsync脚本在各个服务器间同步文件
3.3 SSH无密登录配置
ssh-keygen -t rsa
ssh-copy-id hadoop10X
3.4 集群配置
- core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
</configuration>
- hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
- yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
- mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.5 群起集群
3.5.1 配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
, 添加如下内容:
hadoop102
hadoop103
hadoop104
xsync /opt/module/hadoop-3.1.3/etc
3.5.2 启动集群
- 若集群第一次启动,需要在hadoop102初始化一次NameNode,
hdfs namenode -format
- 启动HDFS
sbin/start-dfs.sh
- 在配置了ResourceManager的节点(如hadoop103)启动YARN
sbin/start-yarn.sh
3.5.3 测试集群
- 上传文件
- 查看文件位置
- 下载
- 执行wordcount程序
3.6 配置历史服务器
- 配置mapred-site.xml,
vim mapred-site.xml
,添加如下内容
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
- 分发配置,
xsync /etc/hadoop/mapred-site.xml
- 在hadoop102启动历史服务器,
mapred --daemon start histroyserver
- 查看历史服务器是否启动,
jps
3.7 配置日志的聚集
- 配置yarn-site.xml,
vim yarn-site.xml
, 添加如下内容
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 分发配置,
xsync /etc/hadoop/yarn-site.xml
- 关闭NodeManager, ResourceManager和HistoryServer
sbin/stop-yarn.sh
mapred --daemon stop historyserver
- 启动NodeManager, ResourceManager和HistoryServer
sbin/start-yarn.sh
mapred --daemon start historyserver
- 删除HDFS上已经纯在的输出文件
hadoop fs -rm -r /output
- 执行WordCount程序,同上
3.8 集群启动和停止方式总结
3.8.1 各模块分开启动/停止
- 整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
- 整体启动/停止Yarn
start-yarn.sh/stop-yarn.sh
3.8.2 各个服务组件逐一启动/停止
- 分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
- 启动/停止Yarn
yarn --daemon start/stop resourcemanager/nodemanager
3.9 编写Hadoop集群常用脚本
3.9.1 Hadoop集群启停脚本(包含HDFS, Yarn和 HistoryServer):myhadoop.sh
atguigu@hadoop102 $ cd /home/atguigu/bin
atguigu@hadoop102 $ vim myhadoop.sh
输入如下内容:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
赋予脚本执行权限,chmode +x myhadoop.sh
3.9.2 查看三台服务器Java进程脚本:jpsall
atguigu@hadoop102 $ cd /home/atguigu/bin
atguigu@hadoop102 $ vim jpsall
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
赋予脚本执行权限,chmode +x jpsall
分发/home/atguigu/bin目录,保证自定义脚本在三台服务器上都可以使用
atguigu@hadoop102 $ xsync /home/atguigu/bin/