Hadoop入门学习笔记(一)
阅读原文时间:2023年07月09日阅读:1

Week2 学习笔记

Hadoop核心组件

  1. Hadoop HDFS(分布式文件存储系统):解决海量数据存储

  2. Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度

  3. Hadoop MapReduce(分布式计算框架):解决海量数据计算

集群角色规划

服务器

运行角色

node1

namenode datanode resourcemanager nodemanager

node2

secondarynamenode datanode nodemanager

node3

datanode nodemanager

下载vmware workstation pro

https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html

百度搜一个密钥用

密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF

下载centos 7系统镜像文件

https://www.centos.org/download/

在vmware安装一台centos 7 虚拟机 并克隆两台

克隆两台

进入虚拟机 修改主机名

查看当前主机名指令: cat /etc/hostname

修改当前主机名指令:vim /etc/hostname

:wq保存后重新加载该配置

重新加载配置指令source /etc/hostname

修改host映射 方便后面操作 省的一直输ip地址

修改指令vim /etc/hosts

查看指令cat /etc/hosts

ps:查看你主机的ip地址指令:ifconfig

防火墙关闭(3台机器)

systemctl stop firewalld.service关闭防火墙

systemctl disable firewalld.service禁止防火墙开启自启

ssh免密登录(node1执行->node1|node2|node3)

ssh-keygen #4个回车 生成公钥、私钥 ssh-copy-id node1ssh-copy-id node2ssh-copy-id node3

集群时间同步(3台机器)

yum -y install ntpdate 安装ntpdate

ntpdate ntp4.aliyun.com从阿里云同步

创建统一工作目录(3台机器)

mkdir -p /export/server/#软件安装路径

mkdir -p /export/data/ #数据存储路径

mkdir -p /export/software/ #安装包存放路径

jdk安装

jdk安装详细过程 https://www.cnblogs.com/stulzq/p/9286878.html

上传、解压Hadoop安装包(node1) 上传可以用rz命令或你的连接工具如finalshell自带的

cd /export/server 进入目录

tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz解压事先准备好的hadoop安装包

Hadoop安装包目录结构

第一类1个:hadoop-env.sh

第二类4个:

xxxx-site.xml ,site表示的是用户定义的配置,会覆盖default中的默认配置。

  1. core-site.xml 核心模块配置

  2. hdfs-site.xml hdfs文件系统模块配置

  3. mapred-site.xml MapReduce模块配置

  4. yarn-site.xml yarn模块配置

第三类1个:workers

所有的配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop

编辑Hadoop配置文件

hadoop-env.sh

export JAVA_HOME=/export/server/jdk1.8.0_241
#文件最后添加
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

core-site.xml

!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 设置Hadoop本地保存数据路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop-3.3.0</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 垃圾桶文件保存时间 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>

hdfs-site.xml

<!-- 设置SNN进程运行机器位置信息 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>

mapred-site.xml

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

yarn-site.xml

<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 是否将对容器实施物理内存限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否将对容器实施虚拟内存限制。 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 开启日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置yarn历史服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 保存的时间7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

workers

node1
node2
node3

分发同步安装包

在node1机器上将Hadoop安装包scp同步到其他机器

cd /export/server
scp -r hadoop-3.3.0 root@node2:$PWD
scp -r hadoop-3.3.0 root@node3:$PWD

在node1上配置Hadoop环境变量

vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

将修改后的环境变量同步其他机器

scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/

重新加载环境变量 验证是否生效(3台机器)

source /etc/profile
hadoop #验证环境变量是否生效

NameNode format(格式化操作)

首次启动HDFS时,必须对其进行格式化操作。

format本质上是初始化工作,进行HDFS清理和准备工作

hdfs namenode -format

执行结果

PS:1. 首次启动之前需要format操作; 2. format只能进行一次 后续不再需要; 3. 如果多次format除了造成数据丢失外,还会导致 hdfs集群主从角色之间互不识别。通过删除所有机 器hadoop.tmp.dir目录重新format解决

shell脚本一键启停

在node1上,使用软件自带的shell脚本一键启动。前提:配置好机器之间的SSH免密登录和workers文件。

HDFS集群

start-dfs.sh  

stop-dfs.sh

YARN集群

start-yarn.sh 

stop-yarn.sh

Hadoop集群

 start-all.sh 

stop-all.sh

启动完毕之后可以使用jps命令查看进程是否启动成功

Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/

HDFS集群UI页面浏览

地址:http://namenode_host:9870

namenode用你指定的node替代

http://node1:9870/dfshealth.html#tab-overview

HDFS文件系统UI页面浏览

YARN集群 UI体验

地址:http://resourcemanager_host:8088

其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip

如我访问的就是http://node1:8088/cluster

shell命令操作

hadoop fs -mkdir /itcast
hadoop fs -put zookeeper.out /itcast
hadoop fs -ls /

Web UI页面操作

执行Hadoop官方自带的MapReduce案例,评估圆周率π的值。

cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 4

HDFS shell命令行常用操作

创建文件夹

hadoop fs -mkdir [-p] ...

path 为待创建的目录

-p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录

查看指定目录下内容

hadoop fs -ls [-h] [-R] [ ...]

path 指定目录路径

-h 人性化显示文件size

-R 递归查看指定目录及其子目录

上传文件到HDFS指定目录下

hadoop fs -put [-f] [-p] ...

-f 覆盖目标文件(已存在下)

-p 保留访问和修改时间,所有权和权限

localsrc 本地文件系统(客户端所在机器)

dst 目标文件系统(HDFS)

查看HDFS文件内容

hadoop fs -cat ...

读取指定文件全部内容,显示在标准输出控制台。 注意:对于大文件内容读取,慎重。

下载HDFS文件

hadoop fs -get [-f] [-p] ...

下载文件到本地文件系统指定目录

-f 覆盖目标文件(已存在下)

-p 保留访问和修改时间,所有权和权限。

拷贝HDFS文件

hadoop fs -cp [-f] ...

-f 覆盖目标文件(已存在下)

追加数据到HDFS文件中

hadoop fs -appendToFile ...

将所有给定本地文件的内容追加到给定dst文件。 dst如果文件不存在,将创建该文件。 如果为-,则输入为从标准输入中读取。

HDFS数据移动操作

hadoop fs -mv ...

移动文件到指定文件夹下 可以使用该命令移动数据,重命名文件的名称

官方架构图

主角色:namenode

  • NameNode是Hadoop分布式文件系统的核心,架构中的主角色。

  • NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。

  • 基于此,NameNode成为了访问HDFS的唯一入口。

  • NameNode内部通过内存和磁盘文件两种方式管理元数据。

  • 其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。

namenode职责

  • NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存储实际数据。
  • NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
  • NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode 重建。
  • NameNode是Hadoop集群中的单点故障。
  • NameNode所在机器通常会配置有大量内存(RAM)。

从角色:datanode

  • DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储。

  • DataNode的数量决定了HDFS集群的整体数据存储能力。

  • 通过和NameNode配合维护着数据块。

datanode职责

  • DataNode负责最终数据块block的存储。是集群的从角色,也称为Slave。
  • DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表。
  • 当某个DataNode关闭时,不会影响数据的可用性。 NameNode将安排由其他DataNode管理的块进行副本复制 。
  • DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中。

主角色辅助角色: secondarynamenode

  • Secondary NameNode充当NameNode的辅助节点,但不能替代NameNode。

  • 主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的“秘书”

写数据完整流程图

核心概念--Pipeline管道

  • Pipeline,中文翻译为管道。这是HDFS在上传文件写数据过程中采用的一种数据传输方式。
  • 客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将 其复制到第三个数据节点。

核心概念--ACK应答响应

  • ACK (Acknowledge character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示 发来的数据已确认接收无误。
  • 在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全

读数据完整流程图

  1. HDFS客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法来打开希望读取的文件。

  2. DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。 对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的 网络拓扑距离近的排序靠前。

  3. DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。

  4. 客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件 中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()

  5. 当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。 这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。 客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。

  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法

一个完整的MapReduce程序在分布式运行时有三类

  • MRAppMaster:负责整个MR程序的过程调度及状态协调

  • MapTask:负责map阶段的整个数据处理流程

  • ReduceTask:负责reduce阶段的整个数据处理流程

示例 评估圆周率π(PI)的值

运行MapReduce程序评估一下圆周率的值,执行中可以去YARN页面上观察程序的执行的情况。

  • 第一个参数:pi表示MapReduce程序执行圆周率计算任务;

  • 第二个参数:用于指定map阶段运行的任务task次数,并发度,这里是10;

  • 第三个参数:用于指定每个map任务取样的个数,这里是50。

[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 10 50

示例位置:/export/server/hadoop-3.3.0/share/hadoop/mapreduce

示例 wordcount单词词频统计

  • 上传文本文件1.txt到HDFS文件系统的/input目录下,如果没有这个目录,使用shell创建

  • hadoop fs -mkdir /input 创建hdfs输入目录

  • hadoop fs -put 1.txt /input 提交文件到hdfs文件系统

  • 准备好之后,执行官方MapReduce实例,对上述文件进行单词次数统计

  • 第一个参数:wordcount表示执行单词统计任务;

  • 第二个参数:指定输入文件的路径;

  • 第三个参数:指定输出结果的路径(该路径不能已存在)

    [root@node1 mapreduce]# pwd
    /export/server/hadoop-3.3.0/share/hadoop/mapreduce
    [root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount
    /input /output

上传到文件系统

执行结果

第一个success没用 只是一个成功失败的标识 第二个part才是真正的结果

执行原理

map阶段执行流程

  • 第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。 默认Split size = Block size(128M),每一个切片由一个MapTask处理。(getSplits)

  • 第二阶段:对切片中的数据按照一定的规则读取解析返回对。 默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)

  • 第三阶段:调用Mapper类中的map方法处理数据。 每读取解析出来的一个 ,调用一次map方法。

  • 第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。 分区的数量就是reducetask运行的数量。

  • 第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。 默认根据key字典序排序。

  • 第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件。

reduce阶段执行流程

  • 第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。

  • 第二阶段:把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序 。

  • 第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对 写入到HDFS文件中。