1.大数据的概念
1.1大数据解决的问题
主要解决,海量数据的存储和海量数据的分析计算问题。
1.2大数据的特点4V
大量volume:数据的数量极其庞大,超过了传统数据库系统的存储和处理能力
高速velocity:数据生成和处理的速度非常快,需要实时或近实时的数据处理能力
多样variety(数据类型多样):数据形式多样,包括文本、图像、视频、音频、传感器数据等
低价值密度value:大数据本身并不一定具有价值,但通过分析和挖掘,可以提取出有价值的信息和见解。
1.3大数据公司的组织架构
1.4大数据的业务流程
1、数据采集
2、数据存储(HDFS)
3、数据预处理:数据清洗、数据转换
4、数据分析
5、数据可视化
2.hadoop1.x和2.x的区别
3.HDFS
3.1HDFS架构
HDFS采用主从架构,由一个主节点(NameNode)和多个从节点(DataNode)组成。
NameNode
- 元数据管理:NameNode负责管理文件系统的元数据,包括文件名、目录结构、文件权限和文件到数据块的映射。
- 协调数据操作: 处理客户端的文件系统操作请求,如打开、关闭和重命名文件或目录。协调DataNode上的数据存储和读取操作。
- 数据块的映射:NameNode 记录每个文件的数据块及其存储在 DataNode 上的位置信息。
- 故障恢复:在DataNode故障时重新分配数据块。
DataNode
- 数据存储:DataNode存储实际的数据块,处理来自客户端和NameNode的读写请求。
- 周期性报告:向NameNode汇报其存储的块信息及其状态(心跳和块汇报)。
- 数据块的读写操作:DataNode 处理客户端和其他 DataNode 的数据块读写请求。
Secondary NameNode
- 辅助操作:减轻 NameNode 负担,定期合并编辑日(edit log)志和 NameNode 的当前状态并推送给NameNode。
客户端client
1、文件切分,文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传:
2、与 NameNode 交互,客户端在执行文件系统操作时,会与 NameNode 进行通信。
3、与 DataNode 交互,客户端在实际读写数据时,会直接与 DataNode 进行通信。
- 写数据:当客户端写入数据时,它会将数据分块,并将这些数据块存储在多个 DataNode 上。客户端首先从 NameNode 获取目标数据块的 DataNode 列表,然后将数据块逐个写入这些 DataNode。
- 读数据:当客户端读取数据时,它会从 NameNode 获取数据块的位置信息,然后直接从相关的 DataNode 读取数据。
3.2数据块(Blocks)
- 固定大小:文件被划分为固定大小的数据块(默认128MB),每个数据块独立存储在不同的DataNode上。
- 数据复制:每个数据块有多个副本(默认3个),存储在不同的DataNode上以提高数据可靠性。
数据块如何设置
如何设置大小。磁盘io越快设置越大,固态硬盘就设置大一些比如256mb
- 大文件处理:较大的块大小适合处理大文件,可以减少 NameNode 的负载,因为 NameNode 需要管理的块数量减少了。这样可以提高数据传输的效率,适合批处理和分析任务。
- 小文件处理:如果块大小过大,而文件较小,会导致存储空间浪费,因为即使一个小文件也会占用一个完整的块空间。为了处理大量小文件,通常建议使用适当的工具或优化策略,如将小文件合并成一个大文件。
3.3HDFS工作流程
3.3.1写入数据
- 客户端向NameNode请求创建文件。
- NameNode检查文件是否已存在并返回允许的DataNode列表。
- 客户端将数据块写入到第一个DataNode,随后该DataNode将数据块复制到其他DataNode。
- NameNode更新文件的元数据信息。
3.3.2读取数据
- 客户端向NameNode请求文件的元数据。
- NameNode返回文件的数据块位置。
- 客户端直接从DataNode读取数据块。
3.4HDFS 的主要优点和缺点
优点:
- 高可扩展性
HDFS 设计用于处理非常大的数据集,并能够横向扩展,以添加更多的节点来增加存储和处理能力。
- 容错性
数据在 HDFS 中是以副本的形式存储的。默认情况下,每个数据块会存储三个副本(一个主副本和两个副本),以确保即使某些节点失败,数据也不会丢失。
- 高吞吐量
HDFS 优化了大文件的存储和读取,能够提供高吞吐量的数据访问。它适用于批处理应用,支持一次性处理大量数据。
- 廉价硬件
HDFS 设计用于运行在廉价的商用硬件上,因此可以降低存储大规模数据的成本。
- 与 Hadoop 生态系统集成
HDFS 是 Hadoop 生态系统的一部分,与 MapReduce、YARN 以及其他 Hadoop 工具(如 Hive、Pig、Spark 等)无缝集成,提供了一个强大的大数据处理平台。
缺点
- 高延迟
HDFS 主要针对高吞吐量而设计,适用于批处理工作负载,但不适合低延迟的实时数据处理应用。
- 小文件问题
HDFS 对大文件进行了优化,但在处理大量小文件时表现不佳。每个文件、目录和块都会占用内存中的元数据,过多的小文件会导致内存消耗增加,影响 NameNode 的性能。
- 单点故障 (NameNode)
虽然 HDFS 通过多个副本保证了数据的冗余,但 NameNode 作为元数据服务器,仍然是单点故障。如果 NameNode 失败,整个 HDFS 集群将无法正常工作。尽管可以通过设置 NameNode 高可用(HA)来缓解这一问题,但仍需要额外的配置和资源。
- 复杂性
HDFS 的设置和管理可能比较复杂,特别是对于没有分布式系统管理经验的用户来说。需要对 Hadoop 生态系统有一定的了解,才能有效管理和优化 HDFS 集群。
- 写操作限制
HDFS 设计为一次写入多次读取(WORM, Write Once Read Many)模型,这意味着一旦文件被写入并关闭,它就不能被修改。这种特性限制了对数据的写入操作,但有助于提高数据读取的性能。
4.yarn
4.1yarn的架构
ResourceManager(资源管理器):资源分配,监控NodeManager
NodeManager(节点管理器)
ApplicationMaster(应用主控)
Container(容器)
5.MapReduce
MapReduce将计算过程分为两个阶段:Map和Reduce
- Map阶段并行处理输入数据(负责分)
- Reduce阶段对Map结果进行汇总(负责合)
6.Hadoop的运行模式
6.1.本地运行模式
6.1.1官方Grep案例
在linux创建文件夹并yum安装hadoop2.7.2,接着配置环境变量
cd /opt/module/hadoop-2.7.2
mkdir input
cp etc/hadoop/*.xml input
#执行share下的脚本
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
cat output/*
6.2.2官方WordCount案例
cd /opt/module/hadoop-2.7.2
mkdir wcinput
cd wcinput
touch wc.input
vi wc.input
hadoop yarn
hadoop mapreduce
atguigu
atguigu
cd /opt/module/hadoop-2.7.2
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
cat wcoutput/part-r-00000
6.2 伪分布式模式
6.2.1 启动HDFS并运行MapReduce程序
[root@localhost hadoop-2.7.2]# cd /opt/module/hadoop-2.7.2/etc/hadoop
配置后本地模式不能用了默认是file:///
<property>
[root@localhost hadoop]# vi core-site.xml<name>fs.defaultFS</name>
</property> <property><value>hdfs://192.168.33.129:9000</value>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property> [root@localhost hadoop]# echo $JAVA_HOME /usr/local/jdk1.8 [root@localhost hadoop]# vi hadoop-env.sh
[root@localhost hadoop]# vi hdfs-site.xml
<property><name>dfs.replication</name>
<value>1</value>
</property>cd ../../
** 格式化**NameNode(第一次启动时格式化,以后就不要总格式化)bin/hdfs namenode -format
启动NameNode sbin/hadoop-daemon.sh start namenode
启动DataNode sbin/hadoop-daemon.sh start datanode
cd data/tmp/dfs/name/current/
cat VERSION
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837
cd data/tmp/dfs/data/current/
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
访问http://192.168.33.129:50070/explorer.html
查看hdfs的文件分布
HDFS上传文件
bin/hdfs dfs -mkdir -p /user/gx/input
bin/hdfs dfs -put wcinput/wc.input /user/gx/input/
bin/hdfs dfs -ls /user/gx/input/
bin/hdfs dfs -cat /user/gx/ input/wc.input
运行MapReduce
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/gx/input/ /user/gx/output
6.2.2 启动YARN并运行MapReduce程序
1.修改yarn-env.sh的JAVA_HOME
2.修改yarn-site.xml
<property></property> <property><name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.33.129</value>
</property> <property></property><name>dfs.namenode.secondary.http-address</name> <value>192.168.33.129:50090</value>
3.修改mapred-env.sh的JAVA_HOME
4.将mapred-site.xml.template重新命名为mapred-site.xml
添加mapred-site.xml
<property></property><name>mapreduce.framework.name</name> <value>yarn</value>
5.启动集群
(a)启动前必须保证NameNode和DataNode已经启动
(b)启动ResourceManager
sbin/yarn-daemon.sh start resourcemanager
(c)启动NodeManager
sbin/yarn-daemon.sh start nodemanager
访问http://192.168.33.129:8088/cluster
运行MapReduce程序查看程序进程的url
运行jar包
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/gx/input /usr/gx/output
6.2.3 配置历史服务器
1.配置mapred-site.xml
<property><name>mapreduce.jobhistory.address</name>
<value>192.168.33.129:10020</value>
</property> <property></property><name>mapreduce.jobhistory.webapp.address</name> <value>192.168.33.129:19888</value>
2.启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
6.2.4配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
1.配置yarn-site.xml
<property><name>yarn.log-aggregation-enable</name>
<value>true</value>
</property> <property><name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
6.3完全分布式模式
1.命令
1.scp安全拷贝(利用ssh协议加密传输)
推的操作
scp -r module root@192.168.33.136:/opt/module
拉的操作
scp -r root@192.168.33.129:/opt/module ./
2.增量拷贝rsync
rsync -rvl module root@192.168.33.136:/opt/module
v是显示复制过程,l是拷贝软链接
3.设置ssh免登录
ssh-keygen -t rsa
ssh-copy-id 192.168.33.136
4.crontab定时任务
- 查看 Crontab 文件:
crontab -l
- 编辑 Crontab 文件:
crontab -e
- 删除 Crontab 文件:
crontab -r
每隔一分钟写一次文件123456( echo是输出 >>是重定向)
*/1 * * * * /bin/echo "123456" >> /opt/module/hadoop-2.7.2/123456.txt
启动crontab service crond restart
5.查看目录结构
ls -R /opt
6.追加 appendToFile
touch liubei.txt
vi liubei.txt
输入
san gu mao lu
hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
7.-get::从HDFS拷贝到本地
8.合并下载 getmerge
hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
9.设置HDFS中文件的副本量
hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
2.配置集群启动
192.168.33.129192.168.33.136
192.168.33.137
HDFS
NameNode
DataNode
DataNode
SecondaryNameNode
DataNode
YARN
NodeManager
ResourceManager
NodeManager
NodeManager
1.编辑workers文件
vi /opt/module/hadoop-2.7.2/etc/hadoop/slaves
192.168.33.129
192.168.33.135
192.168.33.136
2.编写集群分发脚本xsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement! exit;
fi
#2. 遍历集群所有机器
for host in 192.168.33.129 192.168.33.136 192.168.33.137
do
echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done
2.编辑配置文件
(1)配置core-site.xml
[atguigu@192.168.33.129 ~]$ cd $HADOOP_HOME/etc/hadoop
[atguigu@192.168.33.129 hadoop]$ vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration></configuration><!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.33.129:8020</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为root --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property>
(2)HDFS配置文件
配置hdfs-site.xml
[atguigu@192.168.33.129 hadoop]$ vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property><name>dfs.namenode.http-address</name> <value>192.168.33.129:9870</value> </property>
</configuration><property> <name>dfs.namenode.secondary.http-address</name> <value>192.168.33.137:9868</value> </property>
(3)YARN配置文件
配置yarn-site.xml
[atguigu@192.168.33.129 hadoop]$ vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration></configuration><!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.33.136</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>
(4)MapReduce配置文件
配置mapred-site.xml
[atguigu@192.168.33.129 hadoop]$ vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration></configuration><property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
5)在集群上分发配置好的Hadoop配置文件
[atguigu@192.168.33.129 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
2. 启动集群
如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
bin/hdfs namenode -format
1.启动hdfs在192.168.33.129
sbin/start-dfs.sh
sbin/stop-dfs.sh
2.启动yarn在192.168.33.136
sbin/start-yarn.sh
sbin/stop-yarn.sh
4.启动历史服务器
vim mapred-site.xml
在该文件里面增加如下配置。
<property></property> <property><name>mapreduce.jobhistory.address</name> <value>192.168.33.129:10020</value>
<name>mapreduce.jobhistory.webapp.address</name> <value>192.168.33.129:19888</value>
</property>
xsync分发
重启yarn
启动历史服务器
mapred --daemon start historyserver
7.集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
选择192.168.33.129当做时间服务器
主服务器操作
- 检查ntp是否安装(主服务器操作)
rpm -qa|grep ntp
2.修改ntp配置文件
vi /etc/ntp.conf
3.删掉#,解放restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
改成自己的网段
restrict 192.168.33.0 mask 255.255.255.0 nomodify notrap
4.注释掉,集群在局域网中,不使用其他互联网上的时间
5.添加(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
6.修改/etc/sysconfig/ntpd 文件, 增加内容如下(让硬件时间与系统时间一起同步)
vim /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes
7重新启动ntpd服务
service ntpd status
service ntpd start
8.设置ntpd服务开机启动
chkconfig ntpd on
其他服务器操作
1.在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate 192.168.33.129
8.集群启动/停止方式总结
*1**)各个模块分开启动/停止(配置ssh是前提)常用*
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
*2***)各个服务组件逐一启动/**停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
3.2.9 编写Hadoop集群常用脚本
1)Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver****):myhadoop.sh
[atguigu@192.168.33.129 ~]$ cd /home/atguigu/bin
[atguigu@192.168.33.129 bin]$ vim myhadoop.sh
- 输入如下内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..." exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ===================" echo " --------------- 启动 hdfs ---------------" ssh 192.168.33.129 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh 192.168.33.136 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh" echo " --------------- 启动 historyserver ---------------" ssh 192.168.33.129 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ===================" echo " --------------- 关闭 historyserver ---------------" ssh 192.168.33.129 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver" echo " --------------- 关闭 yarn ---------------" ssh 192.168.33.136 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh 192.168.33.129 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
- 保存后退出,然后赋予脚本执行权限
[atguigu@192.168.33.129 bin]$ chmod +x myhadoop.sh
9.常用端口号
10.HDFS详解
1.HDFS客户端是什么
- HDFS Shell(命令行工具):-
hdfs dfs
:这是最常用的命令行工具,用于执行各种文件系统操作,比如列出目录、上传和下载文件、删除文件等。例如,hdfs dfs -ls /
列出根目录下的文件和目录。 - Hadoop API:- Hadoop 提供了 Java API,开发者可以通过这些 API 来编写程序与 HDFS 进行交互。例如,可以使用
FileSystem
类来进行文件读写操作。 - Hadoop 管理界面:- Hadoop 提供了基于 Web 的管理界面,通过浏览器可以访问,通常在
http://<namenode-host>:50070
上运行,用于查看 HDFS 的状态和执行一些基本操作。
2.HDFS 写数据流程(详细)
- 客户端初始化写请求:- 客户端通过
DistributedFileSystem
(HDFS 的 Java API)或命令行工具(如hdfs dfs -put
)初始化写请求。 - 与 NameNode 通信:- 客户端向 NameNode 发送创建文件的请求,包含文件路径和其他元数据。- NameNode 检查文件系统的命名空间,确保目标路径有效且不会导致命名冲突。- NameNode 为文件分配数据块(block),并为每个数据块选择存储的 DataNode 列表,然后将这些信息返回给客户端。
- 客户端分块和写入数据:- 客户端根据文件大小将文件分割成多个数据块(默认块大小为 128MB,但可以配置)。- 客户端根据 NameNode 返回的 DataNode 列表,为每个数据块与相应的 DataNode 建立数据传输管道。
- 数据块的流水线写入:- 客户端将数据块首先发送到管道中的第一个 DataNode。- 第一个 DataNode 接收到数据后,将其写入本地存储,同时将数据转发到管道中的第二个 DataNode。- 第二个 DataNode 接收数据后,再将数据转发到第三个 DataNode,以此类推。
- DataNode 确认:- 每个 DataNode 在成功接收并存储数据后,会发送确认信息回传到前一个 DataNode,依次传回到客户端。- 客户端收到所有 DataNode 的确认信息后,确认该数据块已经成功写入。
- 向 NameNode 报告:- 客户端完成所有数据块的写入后,向 NameNode 发送完成写入的请求。- NameNode 更新文件系统的元数据,记录新文件的位置信息和各数据块所在的 DataNode。
- 完成写入:- 客户端收到 NameNode 的确认后,写入过程完成。- 新文件现在可以通过 HDFS 命令或 API 进行访问和操作。
3.HDFS读流程
- 客户端初始化读请求:
- 客户端通过
DistributedFileSystem
(HDFS 的 Java API)或命令行工具(如hdfs dfs -cat
或hdfs dfs -get
)初始化读请求。
- 客户端通过
- 与 NameNode 通信:- 客户端向 NameNode 发送读请求,请求文件的元数据,包括文件的块列表和每个块的存储位置(DataNode 列表)。- NameNode 检查文件系统的命名空间,确保文件存在,并返回文件的块信息和每个块的存储位置(DataNode 列表)给客户端。
- 客户端选择 DataNode:- 客户端根据 NameNode 返回的块信息和存储位置列表,选择最合适的 DataNode 进行数据读取。选择策略通常包括考虑网络拓扑,以尽量选择距离较近或负载较低的 DataNode。
- 客户端从 DataNode 读取数据:- 客户端直接连接到选定的 DataNode,并请求读取数据块。- DataNode 读取数据块并将数据流返回给客户端。- 如果一个数据块存储在多个 DataNode 上,客户端可以在读取过程中根据需要从其他 DataNode 切换,以提高读取性能或处理节点故障。
- 数据校验:- 客户端在接收数据时,计算接收到的数据校验和(checksum),并与 DataNode 发送的校验和进行比较,以确保数据传输的完整性。- 如果校验和不匹配,客户端会尝试从其他 DataNode 重新读取该块的数据。
- 数据处理:- 客户端将接收到的数据进行处理,如输出到标准输出、保存到本地文件系统或供应用程序使用。
4.Secondary NameNode
的作用
secondary NameNode
(2NN)在 Hadoop HDFS 中不是绝对必需的,但其存在非常有帮助,尤其是在维护系统的健康和性能方面。
- Checkpoint: - 合并
fsimage
和edits
:Secondary NameNode
定期执行 Checkpoint 操作,将当前的fsimage
和edits
文件合并生成新的fsimage
文件。这有助于减小edits
文件的大小,保持 NameNode 的性能和恢复速度。 - 系统健康: - 减小恢复时间:定期的 Checkpoint 可以显著减小 NameNode 启动时需要处理的
edits
文件的大小,从而减少系统恢复时间。
如果没有
Secondary NameNode
会发生什么?
edits
文件增长:没有Secondary NameNode
执行 Checkpoint 操作,edits
文件会不断增长,可能会变得非常庞大。这样,NameNode 在恢复时需要处理的日志量也会增大,从而增加恢复时间和系统负担。- 恢复时间增加:当 NameNode 启动或恢复时,它需要将
edits
文件应用到fsimage
上。如果edits
文件非常大,这个过程会很耗时。
4.1fsimage文件和edits文件是什么
- fsimage:- 用途:存储文件系统的元数据快照。它记录了文件系统的完整状态,包括所有目录和文件的信息。- 作用:在 NameNode 启动时,
fsimage
文件被加载到内存中,用于重建文件系统的元数据。- 存储:fsimage
文件是一个持久化的文件,通常在 NameNode 启动和定期的 Checkpoint 过程中更新。 - edits:- 用途:记录对文件系统的增量修改。每当文件系统发生更改(如创建文件、删除文件、修改权限等),这些更改都会被记录到
edits
文件中。- 作用:在 NameNode 启动时,edits
文件用于应用自上次fsimage
生成以来的所有变更,以恢复到文件系统的最新状态。- 存储:edits
文件是一个日志文件,随着时间的推移会不断增长。为了防止文件过大,HDFS 定期将edits
文件合并到fsimage
中,生成新的fsimage
文件,并清理旧的edits
文件。
简而言之,
fsimage
是文件系统状态的快照,而
edits
是记录变化的日志。通过这两者的结合,HDFS 能够在重启后快速恢复文件系统的状态。
4.2什么是checkpoint
- Checkpointing 的目的:- 保持元数据一致性:通过定期创建
fsimage
和edits 文件
的合并,Checkpoint 确保文件系统的元数据保持一致和最新。- 减小恢复时间:通过将edits
文件的内容合并到fsimage
中,可以减小 NameNode 恢复时的工作量和时间。 - Checkpoint 的过程:- 创建 Checkpoint:Checkpoint 过程将
fsimage
和edits
文件合并,生成一个新的fsimage
文件,该文件包含了从上一个fsimage
到当前时刻所有的元数据变更。- 上传到 Secondary NameNode:通常,在 HDFS 中,Checkpoint 过程由 Secondary NameNode 执行。Secondary NameNode 会定期从 NameNode 获取fsimage
和edits
文件,执行合并操作,并生成新的fsimage
。然后,新的fsimage
会被上传回 NameNode,以替代旧的fsimage
。
5.NameNode的元数据存在哪
fsimage
文件:- 内容:fsimage
是一个包含 HDFS 文件系统当前状态的快照文件,记录了所有文件和目录的元数据,包括文件名、目录结构、权限、块信息等。(并不知道哪个块)- 存储位置:fsimage
文件通常存储在 HDFS 的 NameNode 的本地文件系统中,通常在 NameNode 的配置目录下的current
子目录中。例如,/path/to/namenode/current/fsimage
。edits
文件:- 内容:edits
文件是一个日志文件,记录了自上一次fsimage
创建以来对文件系统所做的所有更改操作(如创建、删除文件和目录等)。它提供了一个增量的变更记录。- 存储位置:edits
文件也存储在 NameNode 的本地文件系统中,通常在current
子目录中。例如,/path/to/namenode/current/edits
。- 内存中的元数据:- 内容:当 NameNode 启动时,它会将
fsimage
文件加载到内存中,以便快速访问和处理文件系统元数据。同时,它会将edits
文件中的变更应用到内存中的数据结构中。- 存储位置:这些数据存储在 NameNode 的内存中,以提供快速的元数据访问和操作。
6.DataNode工作机制
- 数据块存储:- 存储数据:DataNode 接受来自 NameNode 的数据块,并将这些数据块存储在其本地文件系统中。- 数据块管理:每个数据块在 DataNode 上有一个对应的文件,DataNode 负责这些文件的存储、读取和写入操作。
- 数据块报告:- 定期心跳:DataNode 会定期向 NameNode 发送心跳信号,通知 NameNode 自身的状态和健康情况。心跳信号用于检测 DataNode 是否仍在运行。3秒- 数据块报告:DataNode 定期向 NameNode 发送数据块报告,告知 NameNode 它存储的所有数据块的状态。这些报告包括每个数据块的元数据,如数据块的 ID 和状态信息。6小时
- 数据块复制:- 数据块复制:为了保证数据的可靠性,HDFS 将每个数据块复制到多个 DataNode 上(副本数由配置指定)。DataNode 负责接收和存储这些副本,并且在需要时执行副本的复制任务。- 修复数据块:当 NameNode 检测到某个数据块的副本丢失或损坏时,它会触发数据块的重新复制过程。DataNode 负责从其他健康的副本中恢复数据块,以保持数据的高可用性。
- 数据块的读取和写入:- 读取操作:当客户端请求读取某个文件时,NameNode 会提供存储该文件数据块的 DataNode 列表。客户端直接与 DataNode 进行通信,从 DataNode 读取数据块。- 写入操作:当客户端写入数据时,NameNode 选择多个 DataNode 来存储数据块。客户端将数据写入到这些 DataNode 上,以完成写入操作。
- 数据块校验:- 校验和检查:DataNode 负责定期进行数据块的校验,检查数据的完整性和正确性。它会使用校验和机制来验证数据块是否发生了损坏,并在发现损坏时进行修复或报告。3周
11.MapReduce
1.MapReduce的优缺点
优点:高扩展,高吞吐,高容错(任何一台机器挂掉,可以将任务转移到其他节点)
缺点:不擅长实时计算(计算时间在分钟起步)
不擅长流式计算(数据都是一条一条的来)
不擅长DAG有向无环图计算。(A计算后的结果给B计算)
2.Hadoop是如何切片的
- 读取输入文件元数据:- Hadoop首先读取输入文件的元数据(如文件大小、块大小等)。这通常由HDFS提供。
- 计算切片大小:-
FileInputFormat
根据文件的大小和块大小(block size)来计算每个切片的大小。- 切片大小通常设置为与HDFS块大小相等,但也可以通过配置参数进行调整。 - 创建切片:-
FileInputFormat
根据计算出的切片大小,将输入文件分成多个切片(splits)。- 每个切片包含一个起始偏移量和一个长度,用于标识该切片在文件中的位置。 - 作业启动和任务调度:
- 客户端将作业提交到资源管理器(如YARN的ResourceManager)。资源管理器根据切片信息创建相应数量的Map任务,并将这些任务分配到集群中的不同节点。
- 分配切片给Map任务:- 每个切片被分配给一个Map任务进行处理。- Map任务会读取切片中的数据,进行处理并生成中间结果。
3.mapreduce工作流程
1. 输入拆分(Input Splits)
在MapReduce作业启动时,首先需要将输入数据集分割成多个输入拆分(Input Splits)。这些拆分是逻辑上的单元,每个拆分将被一个Map任务处理。输入格式类(例如
TextInputFormat
)负责读取输入文件并计算切片。
2. Map 阶段
每个Map任务读取一个输入拆分的数据,并将其转换为键值对。Map函数在每个输入记录上执行用户定义的操作,并生成一系列中间键值对。Map阶段的主要步骤如下:
- 读取数据:从输入拆分中读取数据记录。
- 调用Map函数:对每个输入记录调用用户定义的Map函数。
- 输出中间键值对:Map函数生成的中间键值对会暂存到内存中,最终写入本地磁盘。
3. Shuffle 和 Sort 阶段
Shuffle和Sort阶段是MapReduce的核心部分,用于对Map任务生成的中间键值对进行排序和分组,以便Reduce任务处理。
- Shuffle:中间键值对从Map任务的输出移动到Reduce任务的输入。Hadoop框架会将相同的键值对发送到同一个Reduce任务。
- Sort:在传输过程中,中间键值对按键进行排序。这一步骤确保相同键的所有值被分组在一起。
4. Reduce 阶段
每个Reduce任务接收来自多个Map任务的中间键值对,并对这些键值对进行处理。Reduce函数会对具有相同键的所有值进行聚合操作,并生成最终的输出键值对。
- 读取中间键值对:从Shuffle和Sort阶段接收排序后的中间键值对。
- 调用Reduce函数:对每个唯一键调用用户定义的Reduce函数。Reduce函数接收一个键及其对应的值列表。
- 输出最终键值对:将Reduce函数的输出写入输出文件。
5. 输出阶段
最终的键值对由Reduce任务写入HDFS或其他存储系统,形成MapReduce作业的最终输出。
4.shuffle机制
1. Map任务输出
2. 数据分区
每个Map任务的输出都会根据键的哈希值进行分区(partitioning),每个分区对应一个Reduce任务。分区的目的是确保同一个键的所有值都被同一个Reduce任务处理。Hadoop默认使用
HashPartitioner
,也可以通过自定义
Partitioner
来定义自己的分区逻辑。
3. 数据溢写与合并
当内存缓冲区满时,Map任务会将缓冲区(默认100M)中的数据溢写到磁盘。在溢写过程中,数据会被按键进行排序(快排)。这种溢写文件(临时)被称为
spill file
。在Map任务结束时,所有的溢写文件会被合并成一个有序的文件。(归并)
4. 数据传输(Shuffle)
在Reduce任务开始之前,Reduce任务会从各个Map任务的输出文件中拉取其对应分区的数据。这是一个通过HTTP进行的数据传输过程,Reduce任务会并行地从多个Map任务中获取数据。
5. 数据排序
在Reduce任务拉取数据的过程中,数据会被临时存储在内存中,并进行归并排序(merge sort)。这个过程确保同一个键的所有值是连续存储的,以便Reduce任务能够顺序处理。
6. Reduce任务处理
当Reduce任务获取并排序所有数据后,会开始处理这些数据。Reduce任务对每个唯一的键调用用户定义的Reduce函数,处理相应的值列表,并生成最终的输出结果。
版权归原作者 Java狂魔哥 所有, 如有侵权,请联系我们删除。