HDFS原理
-
分布式存储:每个节点存储文件的一部分
-
设置统一的管理单位:block块
block是hdfs最小的存储单位,每个block256mb(该大小可以修改) -
当某一个block可能出现丢失损坏的可能
多个副本备份,每个服务器上放一个block的副本,提高安全性
修改HDFS拥有的副本数量
- 修改hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
该属性默认为3,如果要修改,对每一台服务器都需要去修改
- 可以在上传文件时临时修改
hadoop fs -D dfs.replication=2 -put <src> <dst>
- 修改已存在的文件的副本数
hadop fs -setrep [-R] 2 path
[-r]
表示对子目录递归执行,2
表示设置的副本数量,path
文件所在位置
检查文件副本数
使用fsck
指令
hdfs fsck path [-file [-blocks [-locations]] ]
-file
:列出路径中文件的状态
-blocks
: 输出文件块报告(多少块,多少副本)
-locations
:列出副本位置
NameNode 元数据
基于一批edits文件和一个fsimage文件的相互配合完成对整个文件系统的管理
edits
流水账文件,记录hdfs中每一次操作,以及每次操作影响文件对应的block
避免单个文件记录过多内容,存在多个edits文件,从而保证不会存在超大edits影响检索性能
- 当用户需要查看某个文件时,需要在全部的edits中检索,效率很低
- 对该流水账文件进行压缩 edits合并 无论前面操作进行了什么样的操作,只保留最终的文件状态。
合并之后的文件即可得到一个FSImage文件,对edits和fsimage的合并操作是由SecondaryNameNode进行,NameNode只负责写edits
元数据的管理维护
- 每次对HDFS的操作都被edits文件记录
- 单个edits文件达到上限后,开启新的edits文件继续记录
- 定期对edits文件进行合并
- 如果没有fsimage文件,将所有edits合并成第一个fsimage
- 如果已经有了fsimage文件,将所有edits和已存在的fsimage合并,合并成新的fsimage文件
- 重复上述流程
元数据合并控制参数
数据合并是一个定时过程
dfs.namenode.checkpoint.period
默认3600秒dfs.namenode.checkpoint.txns
默认1000000,处理100w次事务
二者满足一个时就执行合并
基于
dfs.namenode.checkpoint.check.period
默认60s来检查上面是否满足条件
数据写入流程
- 客户端向Name Node发起请求
- NameNode审核权限、剩余空间,满足条件后允许写入,并告知客户端写入的DataNode地址
- 客户端向指定DataNode发送数据包
- 被写入的DataNode完成数据复制工作,并将副本发给其他DataNode
- 图中DataNode1将数据复制给DataNode2,DataNode2再复制给DataNode3和DataNode4
- 写入完成后,客户端通知NameNode,NameNode将元数据进行记录,写入edits文件中
1.
N
a
m
e
N
o
d
e
不负责写入,只负责元数据记录和权限管理
\color{red}{1. NameNode 不负责写入,只负责元数据记录和权限管理}
1.NameNode不负责写入,只负责元数据记录和权限管理
2.
客户端只向
1
台
D
a
t
a
N
o
d
e
写入数据,该
D
a
t
a
N
o
d
e
一般时是网络距离最近的那个
\color{red}{2.客户端只向1台DataNode写入数据,该DataNode一般时是网络距离最近的那个}
2.客户端只向1台DataNode写入数据,该DataNode一般时是网络距离最近的那个
3.
数据块的复制工作,是由
D
a
t
a
N
o
d
e
之间自行完成的
\color{red}{3.数据块的复制工作,是由DataNode之间自行完成的}
3.数据块的复制工作,是由DataNode之间自行完成的
数据读取流程
- 客户端向NameNode申请读取文件
- NameNode判断权限等条件后,允许读取,返回该文件的block列表
- 客户端拿到block列表后自行寻找DataNode进行读取
1.
数据不是由
N
a
m
e
N
o
d
e
负责提供的
\color{red}{1.数据不是由NameNode负责提供的}
1.数据不是由NameNode负责提供的
2.
N
a
m
e
N
o
d
e
提供
b
l
o
c
k
列表的时候,会基于网络距离计算尽可能离客户端网络距离近的
\color{red}{2.NameNode提供block列表的时候,会基于网络距离计算尽可能离客户端网络距离近的}
2.NameNode提供block列表的时候,会基于网络距离计算尽可能离客户端网络距离近的
1
个
b
l
o
c
k
会复制三份,三份的内容是一样的,选择离客户端近的即可
\color{red}{1个block会复制三份,三份的内容是一样的,选择离客户端近的即可}
1个block会复制三份,三份的内容是一样的,选择离客户端近的即可
网络距离
从近到远:同一台机器、同一局域网、跨越交换机、跨越数据中心
HDFS内置网络距离计算算法,能够通过IP、路由表等信息来推断网络距离的远近
分布式计算 MapReduce Yarn
以分布式的形式完成数据的统计
-
分散->汇总模式:(Mapreduce)
- 将数据分片,多台服务器各自负责一部分的数据计算
- 将各自的结果进行汇总处理
-
中心调度->步骤执行模式:(Spark)
- 由一个节点作为中心调度管理者
- 将任务划分为几个具体的执行步骤
- 管理者安排每台机器执行任务
MapReduce
过于过时,不使用其相关的代码
提供了两个接口
- MAP:分散
- Reduce: 聚合
Yarn
- MapReduce基于yarn运行
- Yarn是hadoop提供的进行分布式资源调度的组件
资源调度
- 管理服务器硬件资源,提供更好的利用率
- 分布式资源调度: 管理整个分布式服务器集群的全部资源,整合进行统一调度
- 对服务器集群上的资源进行划分,程序施行申请制度,需要多少申请多少,能够 提高资源利用率 \color{red}{提高资源利用率} 提高资源利用率
Yarn管理MapReduce
MapReduce会将任务分解成若干Map和Reduce任务,向Yarn申请资源,Yarn分配好资源后运行,空闲资源可以供其余程序执行
Yarn核心架构
-
主从架构:
- 主角色(master):ResouceManager 整个集群的资源调度者,负责协调调度各个程序所需要的资源
- 从角色(Slave):NodeManager 单个服务器的资源调度者,负责调度单个服务器上的资源提供给程序使用,创建容器
-
容器:基于容器为程序提供资源
- NodeManager预先占用程序的资源,然后将这部分的资源提供给程序使用
- 程序在容器内运行,无法突破容器的资源限制
Yarn辅助结构
提供两个辅助角色使得整个yarn集群运行的更稳定
-
代理服务器(ProxyServer): Web Application Proxy web应用程序代理
- 默认作为资源管理器的一部分运行
- 减少通过YARN进行网络攻击的可能
- 运行时通用一个WEB UI站点,用户可在浏览器中查看YARN的运行信息
- 最大限度保证对WEB UI的访问时安全的
-
历史服务器(JobHistoryServer):应用历史信息记录服务
- 记录历史运行的程序的信息及产生的日志
- 提供WEB UI供用户通过浏览器进行查看
- 程序运行在容器中,运行日志存放在容器内,因此日志的查看很繁琐
Yarn部署
MapReduce配置
- mapred-env.sh文件,添加环境变量
export JAVA_Home=/export/server/jdk
# 设置JDK路径
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
# 设置jobhistoryserver进程的内存为1g
export HADOOP_MAPERED_ROOT_LOGGER=INFO,RFA
# 设置日志级别为log
- mapred-site.xml文件,添加配置
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
设置mr的运行框架为yarn
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
historyserver的通讯端口
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
historyserver的web端口
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
历史信息在hdfs的临时存放路径
<value>/data/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done=dir</name>
历史信息在hdfs的记录路径
<value>/data/mr-history/done</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
mr的home路径设定为hadoop_home
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
mr的home路径设定为hadoop_home
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
mr的home路径设定为hadoop_home
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
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文件
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
rm设置在node1节点
</property>
<property>
<name>yarn.nodemanager.local.dirs</name>
<value>/data/nm-local</value>
rm中间数据的本地存储路径
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
nm数据日志本地存储路径
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
给mapreduce开启shuffle服务
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
historyserver url
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>node1:8089</value>
代理服务器主机端口
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
开启日志聚合
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
程序日志存储路径
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
选择公平调度器
</property>
- 一键启动yarn集群
$HADOOP_HOME/sbin/start-yarn.sh
- 一键关闭
$HADOOP_HOME/sbin/stop-yarn.sh
执行命令后会
-
基于yarn-site.xml中配置的yarn.resourcemanager.hostname决定在哪台机器上启动rm
-
基于workers配置的主机启动NodeManager
-
在某台机器上单独启停
$HADOOP_HOME/bin/yarn --daemon start|stop resourcemanager|nodemanager|proxyserver
- 启停历史服务器
$HADOOP_HOME/bin/mapred --daemon start|stop historyserver
- 配置完成yarn
配置完成后,访问node1的8088端口,即可看到相关的yarn管理界面
提交MR程序到Yarn上运行
Yarn支持MapReduce、Spark、Flink程序运行
MapReduce的代码基本上没有人使用,两个内置程序wordcount(统计文件中的单词数)、pi(MC方法求圆周率)
- 内置程序位置
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
- 提交MR任务
hadoop jar <程序> <java类名> [参数1]...[参数n]
- 示例1 统计一个文件中出现的单词次数
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount hdfs://node1:8020/input hdfs://node1:8020/ output/wc
运行完成后可以进入node1:8088中查看相关的程序运行状态、运行日志等相关信息
- 示例2 利用蒙特卡洛方法计算圆周率
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 3 1000
参数:
3 设置几个map任务
1000 求pi的样本数量