Hadoop入门学习笔记(一)
Week2 学习笔记
Hadoop核心组件
-
Hadoop HDFS(分布式文件存储系统):解决海量数据存储
-
Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
-
Hadoop MapReduce(分布式计算框架):解决海量数据计算
安装hadoop环境
集群角色规划
服务器 | 运行角色 |
---|---|
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
百度搜一个密钥用
密钥 *****-*****-*****-*****-*****
下载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 node1
、ssh-copy-id node2
、ssh-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中的默认配置。
-
core-site.xml 核心模块配置
-
hdfs-site.xml hdfs文件系统模块配置
-
mapred-site.xml MapReduce模块配置
-
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
HDFS 初体验
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校验,确保数据传输安全
读数据完整流程图
-
HDFS客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法来打开希望读取的文件。
-
DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。 对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的 网络拓扑距离近的排序靠前。
-
DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
-
客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件 中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()
-
当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。 这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。 客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
-
一旦客户端完成读取,就对FSDataInputStream调用close()方法
MapReduce学习
一个完整的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文件中。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)