Hadoop入门

发布时间 2023-09-14 17:04:57作者: 里奇在这里

第一章 Hadoop概述

1.1 Hadoop是什么

  1. Hadoop是一个由Apache基金会所开发的分布式系统基础架构
  2. 主要解决,海量数据的存储和海量数据的分析计算问题
  3. 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈

1.2 Hadoop优势

  1. 高可靠性:Hadoop底层维护多个数据副本,因此即使Hadoop某个计算元素或存储出现问题,也不会导致数据丢失
  2. 高扩展性:在集群间分配任务数据,可方便地扩展数以千计的节点
  3. 高效性:在MapReduce的思想下,Hadoop是并行工作的,可以加快任务处理速度
  4. 高容错性:能够自动将失败任务重新分配

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的资源管理器
yarn架构

  • 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

  1. Map阶段并行处理输入数据
  2. Reduce阶段对Map结果进行汇总

1.3.4 HDFS、YARN、MapReduce三者间的关系

HDFS, YARN, MapReduce三者间关系

第二章 Hadoop运行环境搭建

2.1 模板虚拟机准备

2.1.1 下载并安装VMware

2.1.2 CentOS

虚拟机结构

2.1.2.1 配置电脑

Pasted image 20230911105833.png

2.1.2.2 安装系统

按照如下顺序安装即可

Pasted image 20230911132042.png
Pasted image 20230911132125.png
Pasted image 20230911132134.png
Pasted image 20230911132152.png

  • 时间选择上海时区
  • 软件选择gnome界面安装
  • 安装位置需要重点配置
    1. 按照自己需要配置分区
    2. 手动添加分区
    3. /boot —— 1G,修改为ext4文件系统
    4. swap —— 4G
    5. / —— 45G
  • KDUMP关闭
  • 网络打开,主机名重新修改

2.1.2.3 网络配置

需要配置的地方有三处:

  1. vmware虚拟机
    1. vmware网络编辑器——>更改设置——配置VMnet8子网IP地址
    2. NAT设置,配置网关IP地址
  2. win10系统
    1. 系统网络连接设置——>以太网更改适配器选项
    2. VMnet8——>勾选IPv4并双击,修改IP地址
  3. 系统IP

2.1.2.4 IP以及主机名称修改

  1. vim /etc/sysconfig/network-script/ifcfg-ens33
    1. 修改BOOTPROTO="static"
    2. 添加IPADDR, GATEWAY, DNS1字段
  2. vim /etc/hosts
    • 添加主机名称映射(如192.168.10.100 hadoop100)
  • reboot重启

2.1.3 远程终端工具安装

  • xshell
    • 编辑C:\Windows\System32\drivers\etc中的hosts文件,添加主机名称映射
  • xftp
    • windows和linux系统间通讯工具
      远程登录hadoop100对虚拟机进行配置
  1. 安装epel-release
    root@hadoop100 # yum install -y epel-release
  2. 关闭防火墙,关闭防火墙开机服务
    root@hadoop100 # systemctl stop firewalld
    root@hadoop100 # systemctl disable firewalld.service
  3. 配置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

  1. 切换到普通用户,在/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
  2. 卸载虚拟机自带的JDK
    root@hadoop100 # rpm -ga | grep -i java | xargs -n1 rpm -e--nodeps
  3. 重启虚拟机
    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
  • 配置环境变量
    1. 新建sudo vim /etc/profile.d/my_env.sh文件

    # JAVA_HOME
    export JAVA_HOME=/opt/module/jdk1.8.0_212
    export PATH=$PATH$JAVA_HOME/bin

    1. source /etc/profile使新环境变量生效

2.4 在hadoop102安装Hadoop

  • 上传安装包(同上)
  • 解压缩文件(同上)
  • 配置环境变量
    1. 修改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/sbin

    1. source /etc/profile使新环境变量生效

2.5 Hadoop目录结构

  • bin目录:存放对Hadoop相关服务(hdfs, yarn, mapred)进行操作的脚本
  • etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
  • lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或停止Hadoop相关服务的脚本
  • share目录:存放Hadoop的依赖jar包、文档和官方案例

第三章 Hadoop运行模式

  • 本地运行模式:单机运行。生产环境不使用
  • 伪分布式模式:单机运行。具备Hadoop集群的所有功能,一台服务器模拟一个分布式环境。生产环境不使用
  • 完全分布式模式:多台服务器组成分布式环境。生产环境使用

完全分布式安装步骤:

  1. 准备3台client(关闭防火墙、静态IP、主机名称)
  2. 安装JDK
  3. 配置环境变量
  4. 安装Hadoop
  5. 配置环境变量
  6. 配置集群
  7. 单点启动
  8. 配置ssh
  9. 启动并测试集群

3.1 虚拟机准备

参照第二章

3.2 编写集群分发脚本xsync

  1. 拷贝命令
    scp -r user@server:sourcePlace user@server:destinationPlace
  2. rsync远程同步工具
    rsync -av user@server:sourcePlace user@server:destinationPlace
  3. xsync脚本在各个服务器间同步文件

3.3 SSH无密登录配置

ssh-keygen -t rsa
ssh-copy-id hadoop10X

3.4 集群配置

  1. 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>
  1. 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>
  1. 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>
  1. 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 启动集群

  1. 若集群第一次启动,需要在hadoop102初始化一次NameNode,hdfs namenode -format
  2. 启动HDFS
    sbin/start-dfs.sh
  3. 在配置了ResourceManager的节点(如hadoop103)启动YARN
    sbin/start-yarn.sh

3.5.3 测试集群

  1. 上传文件
  2. 查看文件位置
  3. 下载
  4. 执行wordcount程序

3.6 配置历史服务器

  1. 配置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>
  1. 分发配置, xsync /etc/hadoop/mapred-site.xml
  2. 在hadoop102启动历史服务器, mapred --daemon start histroyserver
  3. 查看历史服务器是否启动, jps

3.7 配置日志的聚集

  1. 配置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>
  1. 分发配置, xsync /etc/hadoop/yarn-site.xml
  2. 关闭NodeManager, ResourceManager和HistoryServer
sbin/stop-yarn.sh
mapred --daemon stop historyserver
  1. 启动NodeManager, ResourceManager和HistoryServer
sbin/start-yarn.sh
mapred --daemon start historyserver
  1. 删除HDFS上已经纯在的输出文件
hadoop fs -rm -r /output
  1. 执行WordCount程序,同上

3.8 集群启动和停止方式总结

3.8.1 各模块分开启动/停止

  1. 整体启动/停止HDFS
    start-dfs.sh/stop-dfs.sh
  2. 整体启动/停止Yarn
    start-yarn.sh/stop-yarn.sh

3.8.2 各个服务组件逐一启动/停止

  1. 分别启动/停止HDFS组件
    hdfs --daemon start/stop namenode/datanode/secondarynamenode
  2. 启动/停止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/