hadoop学习 hdfs原理、MapReduce、Yarn

HDFS原理

  • 分布式存储:每个节点存储文件的一部分

  • 设置统一的管理单位:block块
    block是hdfs最小的存储单位,每个block256mb(该大小可以修改)

  • 当某一个block可能出现丢失损坏的可能
    多个副本备份,每个服务器上放一个block的副本,提高安全性

修改HDFS拥有的副本数量

  1. 修改hdfs-site.xml
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>

该属性默认为3,如果要修改,对每一台服务器都需要去修改

  1. 可以在上传文件时临时修改
hadoop fs -D dfs.replication=2 -put <src> <dst>
  1. 修改已存在的文件的副本数
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

元数据的管理维护

  1. 每次对HDFS的操作都被edits文件记录
  2. 单个edits文件达到上限后,开启新的edits文件继续记录
  3. 定期对edits文件进行合并
    • 如果没有fsimage文件,将所有edits合并成第一个fsimage
    • 如果已经有了fsimage文件,将所有edits和已存在的fsimage合并,合并成新的fsimage文件
  4. 重复上述流程

元数据合并控制参数

数据合并是一个定时过程

  • dfs.namenode.checkpoint.period 默认3600秒
  • dfs.namenode.checkpoint.txns 默认1000000,处理100w次事务
    二者满足一个时就执行合并

基于

  • dfs.namenode.checkpoint.check.period默认60s来检查上面是否满足条件

数据写入流程

请添加图片描述

  1. 客户端向Name Node发起请求
  2. NameNode审核权限、剩余空间,满足条件后允许写入,并告知客户端写入的DataNode地址
  3. 客户端向指定DataNode发送数据包
  4. 被写入的DataNode完成数据复制工作,并将副本发给其他DataNode
  5. 图中DataNode1将数据复制给DataNode2,DataNode2再复制给DataNode3和DataNode4
  6. 写入完成后,客户端通知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.客户端只向1DataNode写入数据,该DataNode一般时是网络距离最近的那个
3. 数据块的复制工作,是由 D a t a N o d e 之间自行完成的 \color{red}{3.数据块的复制工作,是由DataNode之间自行完成的} 3.数据块的复制工作,是由DataNode之间自行完成的

数据读取流程

请添加图片描述

  1. 客户端向NameNode申请读取文件
  2. NameNode判断权限等条件后,允许读取,返回该文件的block列表
  3. 客户端拿到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会复制三份,三份的内容是一样的,选择离客户端近的即可} 1block会复制三份,三份的内容是一样的,选择离客户端近的即可

网络距离

从近到远:同一台机器、同一局域网、跨越交换机、跨越数据中心
HDFS内置网络距离计算算法,能够通过IP、路由表等信息来推断网络距离的远近

分布式计算 MapReduce Yarn

以分布式的形式完成数据的统计

  1. 分散->汇总模式:(Mapreduce)

    1. 将数据分片,多台服务器各自负责一部分的数据计算
    2. 将各自的结果进行汇总处理
  2. 中心调度->步骤执行模式:(Spark)

    1. 由一个节点作为中心调度管理者
    2. 将任务划分为几个具体的执行步骤
    3. 管理者安排每台机器执行任务

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集群运行的更稳定

  1. 代理服务器(ProxyServer): Web Application Proxy web应用程序代理

    • 默认作为资源管理器的一部分运行
    • 减少通过YARN进行网络攻击的可能
    • 运行时通用一个WEB UI站点,用户可在浏览器中查看YARN的运行信息
    • 最大限度保证对WEB UI的访问时安全的
  2. 历史服务器(JobHistoryServer):应用历史信息记录服务

    • 记录历史运行的程序的信息及产生的日志
    • 提供WEB UI供用户通过浏览器进行查看
    • 程序运行在容器中,运行日志存放在容器内,因此日志的查看很繁琐

Yarn部署

MapReduce配置

  1. 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

  1. 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 集群配置

  1. 在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
  1. 配置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>

  1. 一键启动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
  1. 配置完成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的样本数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值