目录
一、Hadoop HDFS的存储原理
(1)HDFS以块(Block)为基本单位
设存在一个3GB的大型文件,以及一个存在3台服务器的分布式集群。
然后每个part会划分为若干个Block块(HDFS最小存储单位,默认每个Bolck为256M,可以修改)。
为了安全HDFS会默认为每个Block块建立两个备份(可以修改),分别放到其他服务器上防止Block丢失无法恢复数据。显然一个大文件可以被划分为若干个Block块,只要有一个块丢失文件就无法恢复,块越多丢失的概率越大。
分别放到其他服务器上而不放到一个服务器上是为了防止服务器损坏导致所有备份被破坏。
(2)fsck命令
1)设置备份数
HDFS文件系统的安全性由备份保证,默认会为每个Block块创建两个备份,我们可以通过修改所有服务器的hdfs-site.xml文件更改默认备份数。默认值为3既本体文件+2个备份(注意HDFS是不区分本体与备份的,这里是为了方便理解)。
上述方法是一种全局配置,后续所有文件的存储备份数都将被更改,我们也可以通过命令方法局部配置某个文件的存储备份数:
hadoop fs -D dfs.replication=2 -put test.txt /tmp/ : 上传test.txt文件时,临时设置备份数
为2
-D : 指定配置项
在HDFS系统中以存在的文件修改dfs.replication不会生效,需要使用如下命令:
hadoop fs -setrep [-R] 2 path
-R : 对子目录也生效
2)查看备份数fsck(file system check)
hdfs fsck path [-files [-blocks [ -locations]]]
-files : 可以列出路径内的文件状态
-files -blocks : 输出文件块报告(有几个块,多少个备份)
-files -blocks -locations 输出每个block的详情
例如上传1个test.txt文件,备份数设为2,利用fsck查看其备份数:
假设存在一个块4GB大小的文件,备份数为3,查看其详细信息。
可以看出该文件被划分为15个Block,且每个Block有3个备份,则共有45个block,每个Block(15个)的本体与2个备份都被划分到不同的服务器上。
3)设置block大小
对于一个block默认大小为256M,我们可以对其进行修改。
(3)NameNode元数据
1)基本概念
问题1:在HDFS文件系统中,文件会被划分为若干Block块,当文件很大时,Block会很多很多,Hadoop是如何记录和整理文件以及Block块的关系呢?
回答:NameNode基于一批edits和一个fsimage文件(元数据)完成对整个文件系统的管理与维护。
edits是一个流水账文件,记录了HDFS中的每一次操作,以及本次操作影响的文件其对应的Block块,随着时间的推移,edits文件会越来越大,为了避免不会有超大edits文件的存在,保证检索性能,会产生多个edits文件。
问题2:如果HDFS中只有edits文件,那么用户想要检索一些内容时,会很困难,因为需要遍历所有的edits文件,例如A用户想要查看/tmp/data/test.txt文件的内容,需要按顺序从头到尾遍历所有的edits文件,因为我们并不知道在后面的操作过程中/tmp/data/test.txt文件是否被修改,是否被删除,只有把所有的edits文件全部遍历完才能知道/tmp/data/test.txt文件的最终状态,这样效率很低。因此可以看出edits文件记录的是用户在HDFS上操作的具体过程。检索文件看的是该文件的最终状态。
回答:对edits文件进行压缩,去掉冗余部分,将其直接转化为能够体现最后状态的文件fsimage。
fsimage文件记录了某个时间点的HDFS的最终结果,可以直接使用。
2)具体管理步骤
每次对HDFS的操作,均被edits文件记录
edits达到大小上限后,开启新的edits记录
定期进行edits文件的合并:如果当前没有fsimage文件,则将全部edits文件合并为第一个
fsimage文件
如果已存在fsimage文件,将全部edits和已存在的fsimage文件合
并,形成新的fsimage文件
....不停重复
默认情况下HDFS文件系统每1小时或每100万次操作就会合并一次
dfs.namenode.checkpoint.period 默认3600(秒)
dfs.namenode.checkpoint.txns 默认1000000(次)
检查是否达到条件,默认60秒检查一次
dfs.namenode.checkpoint.check.period 默认60(秒)
NameNode节点只会写edits文件,而edits文件的合并是由SecondaryNameNode节点完成的,然后将生成的fsimage文件提供给NameNode使用。
(4)HDFS数据的读写流程
1)写入流程
注意事项:
NameNode不负责数据写入,只负责权限审批和元数据的记录。
客户端只需向一台由NameNode分配的DataNode写数据,这个DataNode会与其他DataNode进行信息交流,一般NameNode会分配离客户端最近(网络距离)的DataNode,以保证传输效率。
数据块的复制工作又DataNode之间自行完成,客户端只需向DataNode发一份数据即可。
2)读取流程
注意事项:
NameNode不负责数据读取,NameNode只负责权限审批,查找Block块信息以及记录edits
二、Hadoop MapReduce and YARN概述
(1)分布式计算
以分布式的形式完成对数据的分析,挖掘其潜在的有用信息。
假设存在一个很大很大的数据,单个电脑的性能无法独立处理,即使能处理也需要很长很长时间,单个电脑不行我们就用10个,20个,100个。与分布式存储思路一样,一台电脑存不下,那就用10台,20台,100台。
但是,这么多服务器堆在一起对数据进行计算,如何保证计算过程不出错,如何保证服务器之间相互协调呢?-->分布式计算的两种模式:
分散->汇总模式
中心调度->步骤执行模式
1)分散->汇总模式
将数据分片(分片之间相互独立),多台服务器各自复制一部分数据处理,然后将各自处理的结果进行汇总,最总得到想要的计算结果。生活中的“人口普查”就是该模式。
2)中心调度->步骤执行模式
主要用于一些比较复杂的计算过程,该过程并不是通过简单的分散汇总就能得到想要的结果。该模式由一个服务器作为中心调度管理者,将任务划分为几个具体的步骤。首先对数据进行分片,第一阶段各服务器分别处理一个分片得到一组结果,然后第二阶段服务器之间交换各自的结果,第三阶段各服务器根据自己已得出的结果与其他服务器给的结果,再次对所管辖的分片深入分析,...中间可能会有很多轮交换...,最后各服务器都会得出一个最终结果,最最最最终中心调度管理者对这些结果进行汇总。
生活中产品经理与员工就是这种模式。
Hadoop MapReduce是分散->汇总模式,Spark和Fink属于中心调度->步骤执行模式
(2)MapReduce概述
1)MapReduce的接口
MapReduce是分散->汇总模式的分布式计算框架,它提供了2个编程接口:
Map:提供分散的功能,由服务器分布式对数据进行处理
Reduce:提供汇总(聚合)的功能,将分布式的处理结果汇总统计
2)MapReduce执行原理
假设有一个记录了很多单词的文件,且已经开发好了一个MapReduce程序,功能是统计每个单词出现的次数。
(3)YARN概述
MapReduce是基于YARN运行的,如果没有配置YARN,则MapReduce也无法运行(普遍情况)。YARN是hadoop中资源调度的组件,用于管控整个分布式集群的全部资源,实现统一调度,提高资源利用率。例如有块露营草地,没人管理,人们想在那露营就在那露营,如下图所示:
可以看到整块草地资源有很多地方被浪费(绿色),只容纳了4个大帐篷和8个小帐篷,而如果该露营草地有人管理(管理者YARN),YARN就可以对草地资源进行统一调度,可见只有很少资源被浪费,提高了资源的利用率,容纳了5个大帐篷和22个小帐篷。
在程序运行过程中,YARN管控着整个分布式集群的所有资源,如果此时有个程序想要获取资源来运行,需要向YARN打报告,然后YARN给他提供资源。所有程序的运行都是在YARN的监管下运行的,这就像资源全部都是公司的(YARN),由公司分配给个人(具体的程序)使用(申请预约制)。
1)MapReduce是如何基于YARN运行的
还是上述MapReduce中的例子,现在有4台服务器,其中3台执行Map,1台执行Reduce,那么哪三台执行Map,哪台执行Reduce呢,这就是YARN需要做的工作。
又例如,当前的分布式集群有3台8G内存的服务器,由YARN管控;
已经开发好一个MapReduce程序,包含3个Map任务和1个Reduce任务
Map任务需要2G内存,Reduce需要4G内存
MapReduce程序向YARN申请资源:
空闲的资源可供其他程序使用
2)YARN的核心架构
YARN是主从架构,有2个角色:
主角色:ResourceManager
从角色:NodeManager
ResourceManager是整个分布式集群的资源调度者,负责协调全局。(公司董事长)
NodeManager是单个服务器的资源调度者,负责调度单个服务器的资源提供给应用程序使用(公司各部门总经理)
问题:假设有20台服务器,目前的程序需要使用4台服务器运行,ResourceManager管理者负责从20台服务器中选择满足条件的4台服务器供程序使用,但是该程序并不会占用这4台服务器的全部资源,可能只占用一部分,例如CPU占用30%,内存占用20%,那么这么精准的资源分配YARN是如何做到的呢?---->使用容器技术(是一种虚拟化技术)提前占据资源。
NodeManager预先利用容器占用程序所需的资源,然后在将这些资源提供给程序使用,程序会在容器内运行,它无法突破容器的资源限制,如果没有容器程序看到服务器还有空闲资源会自动全部抢占。
3)YARN的辅助架构
YARN除了上述ResourceManager与NodeManager两个角色之外,还可以搭配两个辅助角色使得YARN集群运行更加稳定:
代理服务器(Web应用代理,WebAppProxyServer):提高YARN在开放网络中的安全性
历史服务器(JobHistoryServer):记录历史信息
YARN在运行时会提供一个WEB UI站点(同HDFS一样),该站点可供用户在浏览器内查看YARN的运行信息,然而对外提供WEB站点会有安全性问题(可能会受到非法用户或黑客的攻击等等),代理服务器的功能就是最大限度保障对WEB UI的访问是安全的。默认情况下,代理服务器角色由ResourceManager角色所对应的服务器担任,这种方式安全性保障不够高,我们可以将代理服务器角色单独在一个服务器上运行。
历史服务器用于记录在YARN中所运行的程序信息和日志信息
问题:程序的日志信息都会记录在日志文件中,只需要打开日志文件就能查看日志,这里为什么还要单独弄一个历史服务器来记录日志信息呢?
假设一个开发好的MapReduce程序,有5个Map任务和1个Reduce任务,首先该程序向ResourceManager申请资源,ResourceManager分配了三台服务器供该程序使用,然后NodeManager利用容器占好所需资源并提供个这个程序运行,在运行过程中每个任务都在容器内运行,所产生的日志信息也会在不同的容器中,日志信息很分散且容器的访问很麻烦需要一长串代码。因此,需要对每个任务产生的日志信息进行打包汇总。
总结:
三、MapReduce and YARN部署
集群规划:
(1)MapReduce配置
修改mapred-env.sh文件,添加环境变量
export JAVA_HOME=/export/server/jdk
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000 : 设置历史服务器内存为1G
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA:设置日志级别日志打印的8种级别(很详细)_日志级别_Archie_java的博客-CSDN博客
修改mapred-site.xml文件,添加如下信息:
(2)YARN配置
修改yarn-env.sh文件,添加环境变量
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$/HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
修改yarn-site.xml文件,添加如下信息:
注意上述配置在所有服务器上都需要修改:
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node22:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node33:`pwd`/
(3)启动进程
start-dfs.sh
start-yarn.sh : 一键启动YARN(不会启动历史服务器)
自动基于yarn-site.xml中配置的yarn.resourcemanager.hostname启动ResourceManager节点,自动基于workers文件配置的主机启动NodeManager,然后在当前服务器上启动代理服务器
stop-yarn.sh : 一键停止YARN
单独启停YARN各角色
yarn --daemon start | stop resourcemanager | nodemanager | proxyserver
mapred --daemon start | stop historyserver
node11:8088 : YARN开启后自动给用户提供一个WEB UI管理界面
四、MapReduce and YARN的使用
目前YARN已经部署好了,之后就可以在YARN中运行程序了例如MapReduce、Spark、Flink程序都可以在YARN中运行。
我们使用Hadoop官方提供的预置MapReduce程序(wordcount:单词计数程序;pi:使用蒙特卡罗算法近似求圆周率),让其在YARN中运行。这些预置的程序都在/export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar文件内。可以通过hadoop jar命令来运行这些内置程序,并提交至YARN中。
语法:hadoop jar 程序文件 java类名 [程序参数]...[程序参数]
(1)提交wordcount程序到YARN
功能分析:给定待统计的文件路径,输出统计结果到指定路径
hadoop fs -mkdir -p /input/wordcount
hadoop fs -mkdir /output
hadoop fs -put word.txt /input/wordcount
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-example-3.3.4.jar wordcount hdfs://node11:8020/input/wordcount/ hdfs://node11:8020/output/wc1
注意:需要保证输出的文件夹不存在
在hadoop jar命令中为了保证命令不出错建议写上协议头
SUCCESS文件是一个标识文件,表示程序成功运行。part-r-00000是真正的输出结果
可以查看历史服务器记录的日志信息:
(2)提交pi程序到YARN
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 3 1000
3:表示设置3个map任务
1000:表示模拟求PI的样本数,值越大求出的pi越准确
蒙特卡罗求pi(python)