HADOOP学习笔记

分类: Hadoop

HADOOP学习笔记

1.Hadoop是什么

Hadoop是一个由Apache基金会所开发的分布式系统基础架构

-分布式:多台服务器共同完成某一个任务

Hadoop主要解决海量数据的储存和海量数据的分析计算问题

2.HDFS架构概述

Hadoop Distributed File System - HDFS 分布式文件系统

NameNode Server:记录每一个文件快存储的位置(元数据,相当于索引)

DateNode Server:具体存储数据的位置(数据及数据校验和)

2NM Server :辅助NameNode工作 (对元数据备份)

3.YARN架构概述

Yet Another Resource Negotiator 资源协调者 是Hadoop中的资源管理器(cpu与内存资源分配)

Resource Manager(RM): 管理整个集群资源

NodeManager(NM): 管理单个节点资源

ApplicationMaster(AM): 管理单个任务资源

Container: 容器 里面封装了任务运行所需要的资源(容器技术)

image-20251101125028993

APPMSTR向RESOUREMANAGER申请资源 RESOURCEMANAGER给APPMSTR分配资源 当一个节点上的资源不够了 容器还可以切换到其他节点是

4.MapReduce架构概述

解决Hadoop中海量数据计算的功能

Mapreduce将计算过程分为两个阶段:Map和Reduce

image-20251101130556410

map:将任务分发给各个主机

reduce:汇总

5.HDFS/YARN/MapReduce三者关系

image-20251101131119329

ResourceManager收到client的任务,创建一个任务容器这个容器负责分发任务给每个节点,每个节点创建任务容器执行任务.最后汇总.

6.大数据生态体系

image-20251101131916418电商平台个性化推荐流程

photo_2025-11-01_13-23-33

photo_2025-11-01_13-30-40

7.HADOOP模板虚拟机的制作和安装

1.安装VMWARE
2.安装Centos
虚拟机配置

虚拟机配置:2C4T 4G 50G

配置IP地址和主机名称

VM虚拟机设置

image-20251101135708800

实体机设置:IPV4 192.168.10.1 ,网关192.168.10.2

DNS1 192.168.10.2 DNS2 8.8.8.8

虚拟机配置:

IP

vi /etc/sysconfig/network-scripts/cfg-ens33

将DHCP改成static 在下方插入

IPADDR=192.168.10.100

GATEWAY=192.168.10.2

DNS1=192.168.10.2

主机名

vi /etc/hostname

配置主机名映射

vi /etc/hosts

在下方添加

192.168.10.100 hadoop100

192.168.10.101 hadoop101

...

192.168.10.108 hadoop108

最后reboot重启生效

重启后查看ipaddr和ping baidu.com测试是否生效

编辑Windows(调试机)host文件

c:/windows/system32/drivers/etc/hosts文件

添加和主机上一样的配置

3.安装Xshell

安装xshell & xftp

4.安装epel-release 软件库

解决镜像源失效问题

sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

sudo sed -i \ -e 's/mirrorlist/#mirrorlist/g' \ -e 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \ /etc/yum.repos.d/CentOS-Base.repo

sudo yum clean all sudo yum makecache

5.安装额外组件

安装epel

yum install -y epel-release

安装net-tools

yum install -y net-tools

yum install -y vim

6.关闭防火墙 关闭防火墙开机自启

systemctl stop firewalld

systemctl disable firewalld.service

7.创建一个用户

useradd hadoop

passwd hadoop

给予这个用户root权限

image-20251101172659709

8.创建文件夹

在opt目录下mkdir module 和 software用于存放所有软件

sudo chown hadoop:hadoop moudle/ software/

9.卸载默认的jdk

rpm -qa | grep -i java 查看是否又安装

有的话卸载

重启虚拟机

8.克隆虚拟机

关闭虚拟机

右键虚拟机 管理 克隆

并依次给每个虚拟机配置对应的IP和主机名

11.JDK安装

在hadoop102上安装JDK 之后拷贝到其他服务器

1.https://xiandan.io/posts/jdk-download.html 下载JDK并上传到曾经创建的software文件夹中

2.之后执行 tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/moudle/

3.待到解压完后之后cd到moudle/jdk目录下

4.cd到/etc/profile.d/

5.创建my_env.sh并编写

image-20251101185631904写入这些内容

6.刷新source /etc/profile

12.Hadoop安装

1.cd /opt/software

2.上传hadoop包到目录下

3.解压hadoop包 tar -zxvf hadoop-3.1.3\ (1).tar.gz -C /opt/moudle/

4.sudo vim /etc/profile.d/my_env.sh 编辑刚写的脚本文件

5.在其中加入这些内容

image-202511011909050116.刷新source /etc/profile

13.Hadoop的目录结构

image-20251102064726453

hdfs: 存储相关

maored: 计算相关

yarn: 调度相关

etc: 大量配置信息

native: 本地动态链接库

sbin: 启动集群相关命令

share: 学习资料 文档

14.hadoop的运行模式

local mode 数据储存在本地 本地模式

pseudo-distributed mode 数据存储在HDFS 伪分布式

fullydistributed mode 数据存储在HDFS/多态服务器工作 完全分布式

本地模式:偶尔测试用 不再生产环境使用

伪分布式:只有一台机器却要做集群/预备集群 资源有限的生产环境

15.本地运行模式

示例:统计一个TXT中每个名字出现的次数

在hadoop目录下创建wcinput文件夹

在wcinput文件夹下放待处理数据

​ word.txt

test1

test2

test3

test4

处理其中每项出现的次数

返回hadoop目录 cd ..

执行官方预制包 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput

指令格式:执行的jar包 参数 输入路径 输出路径

输出路径不能存在 执行命令时会创建

处理完毕 查看结果

cd ..

cd ./wcoutput

ls

查看数据cat part-r-00000 统计好的数据就出现在这里了 数据-出现次数

test1 1 test2 1 test3 1 test4 1

16.完全分布式运行模式

​ 前置条件:需准备三台配置好IP 防火墙 主机名的主机 并都安装了JDK环境 配置好hadoop

​ 目前只在hadoop102上配置好了JDK和HADOOP环境 需要把102上的hadoop环境拷贝到其他机器上

SCP 安全拷贝工具

实现服务器与服务器之间的数据拷贝

scp -r 要拷贝文件路径 $user@$host:$pdir/$fname

命令 递归 路径 目的地主机@目的地的路径/名称

--

拷贝实操:
利用SCP命令将102上的JDK推到103

ssh到102

cd到/opt/moudle

scp -r jdk1.8.0_212/ hadoop@192.168.10.103:/opt/moudle

首次连接输入yes

输入输入密码hadoop

等待拷贝完成.. 这样jdk就克隆到103上了

再试试从103把102上的hadoop拉过去:

ssh到103

cd /opt/module/

scp -r hadoop@192.168.10.102:/opt/moudle/hadoop-3.1.3 ./

yes

hadoop

克隆完成

在试试在103上把102上的数据拷贝到104中

scp -r hadoop@192.168.10.102:/opt/moudle/* hadoop@192.168.10.104:/opt/moudle

依次输入两台主机的密码

等待拷贝成功

rsync 远程同步工具

将一台机器上的修改同步到其他机器(第一次同步等同于拷贝)

rsync -av 要拷贝的文件目录名称 目的地用户@主机:目的路径/名称

同步实操

将102上的hadoop同步到103上

rsync -av hadoop-3.1.3/ atguigu@hadoop103:/opt/moudle/hadoop-3.1.3/

输入密码

等待同步完成

xsync集群分发脚本

在rsync基础上进行封装让多台机器文件拷贝更方便

Demo:

​ 在HOME路径下有一个a.txt文件,在我们执行一个命令后,可以一键把这个文件分发到多个主机的的同一个目录下

​ 效果:xsync a.txt一旦执行其他几台主机的home目录下同步出现这个文件

​ 实现这个功能:

找任意位置存放脚本文件

touch /home/hadoop/

cd /home/hadoop/

mkdir bin

cd ./bin

touch

写入文件 xsync

  1. #!/bin/bash
  2. # 判断参数个数
  3. if [ $# -lt 1 ]
  4. then
  5. ​ echo Not Enough Arguement!
  6. ​ exit;
  7. fi
  8. # 2.遍历集群所有节点
  9. for host in hadoop102 hadoop103 hadoop104 #要编辑一下这里, 这里是你的主机名
  10. do
  11. ​ echo ==================== $host ====================
  12. # 3.遍历所有目录,挨个发送
  13. ​ for file in $@
  14. ​ do
  15. # 4.判断文件是否存在
  16. ​ if [ -e $file ]
  17. ​ then
  18. # 5.获取父目录
  19. ​ pdir=$(cd -P $(dirname $file); pwd)
  20. # 6.获取当前文件的名称
  21. ​ fname=$(basename $file)
  22. ​ ssh $host "mkdir -p $pdir"
  23. ​ rsync -av $pdir/$fname $host:$pdir
  24. ​ else
  25. ​ echo $file does not exists!
  26. ​ fi
  27. ​ done

编辑完之后, 对这个脚本赋予执行权限

chmod +x /home/hadoop/bin/xsync

测试脚本 将脚本分发到其他机器 xsync /home/hadoop/bin

给这个脚本添加变量环境
vi ~/.bashrc
# User specific environment and startup programs
export PATH=$PATH:/home/hadoop/bin
source ~/.bashrc

SSH免密登录配置

Hadoop 集群启动时,NameNode 需要通过 SSH 远程启动其他节点的进程,如果不配置免密,启动时需要输入几十次密码。

hadoop102 (NameNode) 需要免密登录 -> 102, 103, 104

hadoop103 (ResourceManager) 需要免密登录 -> 102, 103, 104

生成公钥和私钥
ssh-keygen -t rsa
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104

同样操作要在每台机器上做一遍

集群部署规划

主机 HDFS YARN
hadoop102 NameNode, DataNode NodeManager
hadoop103 DataNode ResourceManager, NodeManager
hadoop104 SecondaryNameNode, DataNode NodeManager

配置集群核心文件

配置文件位于 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下

现在一台机器上执行下面操作:

配置 core-site.xml
vim core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
    </property>
</configuration>
配置 hdfs-site.xml
vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop102:9870</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>
</configuration>
配置 yarn-site.xml
vim yarn-site.xml
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <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
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
配置 Workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
分发配置文件

在 hadoop102 上执行,将配置好的 etc 文件夹分发给 103 和 104。

xsync /opt/module/hadoop-3.1.3/etc/hadoop/

群起集群

hadoop102 上执行

hdfs namenode -format

启动 HDFShadoop102 (NameNode所在节点) 上执行:

start-dfs.sh

启动 YARNhadoop103 (ResourceManager所在节点) 上执行: 注意: 这里必须切换到 hadoop103 去启动,因为我们在配置文件里指定了 RM 是 103

ssh hadoop103
start-yarn.sh
验证集群状态

1.分别在三台机器上输入 jps

102: NameNode, DataNode, NodeManager
103: ResourceManager, NodeManager, DataNode
104: SecondaryNameNode, NodeManager, DataNode

2.Web 端查看

HDFS 界面: http://hadoop102:9870
YARN 界面: http://hadoop103:8088

集群测试

hadoop fs -mkdir /input
hadoop fs -put /opt/module/hadoop-3.1.3/wcinput/word.txt /input
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
hadoop fs -cat /output/*