Hadoop框架包括下述三个个模块
HDFS:Hadoop集群中最根本的文件系统(数据存储)
一个HDFS集群是由一个NameNode和若干个DataNode组成的
NameNode作为主服务器,管理文件系统命名空间和客户端对文件的访问操作。
DataNode管理存储的数据,HDFS支持文件形式的数据。
DataNode负责管理节点上它们拥有的存储,它将存储划分为多个block块,管理block块信息,同时周期性的将其所有的block块信息发送给NameNode。
MapReduce:为能够在集群上分布式处理海量数据而量身订做的框架
MapReduce job可以分为三次连续过程。
Map 将输入数据划分为key-value集合
Shuffle 将Map产生的结果传输给Reduce
Reduce 则对接收到的key-value进一步处理
YARN:为应用执行分配计算资源的一个框架
YARN主要包含下面三个核心组件
ResourceManager(一个集群只有一个)
ApplicationMaster(每个应用都有一个)
NodeManagers (每个节点都有一个)
1.Yarn
1.Yarn架构
1.resourcemanger : 负责资源的分配
2.nodemanager : 负责资源的供给与隔离
Yarn
1.资源调度
resourcemanger将nodemanager上资源分配给task
2.资源隔离
nodemanager按照要求给task提供资源,保证供给的资源有独占性
资源
nodemanager指挥分配的资源
container:(一定比例的cpu和mem)
cpu
mem
2.yarn的架构设计
1. mr作业运行·如何申请资源去运行作业?
1.client =》 rmapps发送请求·去运行·jar·(appmaster)
2.apps 分配一个container·去运行appmaster.
3.app master向apps manager ·去注册,(yarn-web·可以看到iob·运行情况)
4.app master 向 resouce scheduler-申请资源运行 我的代码
5-6.nodemanager会开启资源container去运行map task reduce task
7.task 会向 app-master 汇报代码的运行情况
8.当运行完成之后appmaster 会给 apps manager 通知我的作业运行完成了 请求释放资源
9.apps manager 收到请求之后 通知客户端 你的代码运行完成了
补充
input :map task个数·=》·container.申请的个数
reduce :educe task·=》·container.由请的个数
2.调度器
1.FIFO scheduler
先进先出 单队列
2.Capacity scheduler (容量调度器)
多队列、每个队列之间 互不影响 先进先出
3.Fair scheduler (公平调度器)
多队列、·每个队列之间 job 有影响 不是先进先出
job的优先级
3.默认调度器:
Capacity scheduler.容量调度器
yarn.resourcemanager.scheduler.class.=》 CapacityScheduler
3.调优
yarn调优
1.container
一定比例的mem和cpu
2.针对集群中每个节点对container进行配置
刀片服务器配置 128G 16物理core
1.刀片服务器装完系统 消耗1G
2.系统预留20%内存
1.给未来部署组件预留内存空间
2.防止全部使用会导致系统夯住 oom机制【liniux系统】
3.目前位置 大数据服务资源 102G
hadoop
Datanode 进程内存2G
nodemanager 进程内存4G
102G - 2G - 4G = 96G =>yarn资源 container一共96G
container资源分配
内存
cpu【core】
1. container内存
总
yarn.nodemanager.resource.memory-mb 96G 【默认值是8G】
最小
yarn.scheduler.minimum-allocation-mb 1g 极限情况下 会有96个container
最大
yarn.scheduler.maximum-allocation-mb 96G 极限情况下 会有1个container
注意:container内存会自动增加 默认1G增加
2. contaner cpu
虚拟核 vcore :设计初衷 考虑不同节点的cpu的性能不一样
例如: 某个物理cpu是另外一个物理cpu的2G
第一机器:强悍 pcore: vcore=1: 2 (1core·当成2core使用)
第二机器:不强悍 pcore: vcore=1: 1
16个物理核: 16vcore
虚拟核 和物理核的比例 :
yarn.nodemanager.resource.pcores-vcores-multiplier 2
yarn core =》 vcore 16*2 = 32 vcore
总:
yarn.nodemanager.resource.cpu-vcores 32 【默认是8vcore】
最小:
yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container
最大:
yarn.scheduler.maximum-allocation-vcores 32 极限情况下 只有1个container
实际开发角度:
1.mem 为主
2.cpu :
cloudera 公司推荐 一个contaier 的vcore 最大值最好不要超过5 4
理想情况下:标准 cloudera 公司
cpu角度:
16个物理核 : 16vcore
虚拟核 和物理核的比例 :
yarn.nodemanager.resource.pcores-vcores-multiplier 2
yarn core =》 vcore 16*2 = 32 vcore
总:
yarn.nodemanager.resource.cpu-vcores 32 【默认是8vcore】
最小:
yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container
最大:
yarn.scheduler.maximum-allocation-vcores 4 极限情况下 只有8个container
反推内存:
vcore 4 container 8个
总:
yarn.nodemanager.resource.memory-mb 96G 【默认值是8G】
最小:
yarn.scheduler.minimum-allocation-mb 1G 极限情况下 会有96个container
最大:
yarn.scheduler.maximum-allocation-mb 12G 极限情况下 会有8个container
注意:
container内存会自动增加 默认1g递增
container:
1. 8-32 个container => task 8-32个
2.以内存为主
总:
yarn.nodemanager.resource.memory-mb 96G 【默认值是8G】
最小:
yarn.scheduler.minimum-allocation-mb 2G
最大:
yarn.scheduler.maximum-allocation-mb 20G
20G => container ? 5个container
2g => container ? 48个container
4G 2core
1.内存
总:
yarn.nodemanager.resource.memory-mb 4G 【默认值是8G】
最小:
yarn.scheduler.minimum-allocation-mb 1g 极限情况下 会有96个container
最大:
yarn.scheduler.maximum-allocation-mb 2G 极限情况下 会有8个container
2.cpu 2
虚拟核 和物理核的比例 :
yarn.nodemanager.resource.pcores-vcores-multiplier 2
总:
yarn.nodemanager.resource.cpu-vcores 4 【默认是8vcore】
最小:
yarn.scheduler.minimum-allocation-vcores 1 极限情况下 只有32个container
最大:
yarn.scheduler.maximum-allocation-vcores 2 极限情况下 只有8个container
修改配置内存
修改 yarn-site.xml:
路径:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@bigdata13 hadoop]$ vim yarn-site.xml
#内存:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
#cpu:
<property>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>2</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
同步到其他:[hadoop@bigdata13 hadoop]$ xsync yarn-site.xml
mapreduce:
1.map task reduce task 默认申请的container:cpu mem 分别是多少?
2.map task:
1.mem
mapreduce.map.memory.mb 默认是1024
一个map task 申请的内存资源是 1024M
如果map task 实际使用的资源量超过该值 task将会被强制杀死
2.cpu
mapreduce.map.cpu.vcores 默认是1
3.reduce task :
1.mem
mapreduce.reduce.memory.mb 默认是1024
2.cpu
mapreduce.reduce.memory.mb 默认是1
了解:
mr: 进程级别 job =》 进程 maptasks、 redue tasks =》 jvm
map task :
mapreduce.map.java.opts jvm相关调优参数即可
reduce task
mapreduce.reduce.java.opts jvm相关调优参数即可
jvm参数调优=》
1.提交mr作业时可以指定 ?当前job生效
hadoop jar xxx.jar xxx参数 指定job运行时资源的参数
2.集群环境里面可以配置:? 全局生效
mapreude-site.xml
3.最常见的 code =》 当前job生效
code
Configration
2.存储 hdfs (存储文件)
压缩:
1.为什么要使用压缩?
1.节省空间 (1file hdfs 3个副本)
2.节省时间:网络io 和磁盘io 会减少
mapreduce 过程中 map端输出采用压缩
1.经过网络传输的数据量会变少 【减少了网络io】
2.磁盘上数据压缩后,读取到内存的数据量也会变少 【减少磁盘io】
2.使用场景?
1.采用压缩,对机器的cpu要求比较高
2.存储数据的空间不够
3.凡事都有两面性?
1.采用压缩
空间 和时间 减少
2.cpu 消耗 cpu利用率高 =》 会导致整个mr作业处理数据时间会稍微长一些
4.如何使用压缩?
1.存储角度
压缩普通文件
2.计算角度 mr spark flink
1.input mr 不用考虑 切片会对压缩格式进行校验 =》 源码里面
2.map out 配置参数即可
3.reduce out 配置参数即可
5.常见的压缩格式
gzip
bzip2
LZO
Snappy
LZ4
1.压缩比
Bzip2 30% GZIP snappy、lzo 50%
解压速度:
snappy、lzo GZIP Bzip2
2.压缩文件是否可以被切分?
1.假设一个 5G文件 不能被切分 split 意味着 只能使用一个map task去处理
map task 5G
2.假设一个 5G文件 能被切片 splits 10map task 去并行处理
5*1024 /10 = 一个map task 处理的数据
3. 能否被切分 决定了 你的 一个map task处理的数据量有多少
3.压缩后的文件是否支持分割?
gzip 不可分割
bzip2 可分割
lzo 带索引的可以分割 (默认是不支持分割的)
snappy 不可分割的
4.mapreduce 每个阶段该如何采用这些算法?
input =》 maps =》 reduce =》 output
input:
Bzip2
支持分割 多个map task 进行出
map out:
1. shuffle 过程 要选择一个解压 速度快的压缩格式
2.snappy 、lzo
reduce out :
1.高的压缩比 + 支持分片 =》 节省空间
2.bzip2 、lzo带索引的
reduce out 数据 作为下一个
map 的输入咋办?
建议使用bzip2【如果采用压缩的话】
压缩配置
1.mapreduce 压缩配置:
1.配置压缩的codec
2.map reduce 输出配置:
1.先打开压缩的开关
2.配置codec 即可
2.hadoop集群hdfs 支持哪些压缩?
1.命令 hadoop checknative
2.core-site.xml:
配置支持的压缩
mapred-site.xml:
io.compression.codecs
1.先打开压缩的开关
2.map reduce 输出 压缩算法
补充:
原生 hadoop 默认不支持 lzo的压缩
bzip2gzip snappy
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec
</value>
</property>
mapred-site.xml:
1.先打开压缩的开关
2.map reduce 输出 压缩算法
reduce: 开关
mapreduce.output.fileoutputformat.compress
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
mapreduce.output.fileoutputformat.compress.codec
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
3.各个DN节点数据平衡
eg:
DN1 存储空间 90%
DN2 存储空间 60%
DN3 存储空间 80%
如何做呢?
sbin/start-balancer.sh
parameters = Balancer.BalancerParameters
[BalancingPolicy.Node, threshold = 10.0, max idle iteration = 5,
数据平衡的默认阈值:threshold = 10.0
每个节点的磁盘使用率 - 平均的磁盘使用率 <10%
DN1 存储空间 90% -76% = 14% 说明这个节点数据多 往别的节点迁移数据 出
DN2 存储空间 60% -76% = -12% 说明这个节点数据少 别的节点迁移数据 进
DN3 存储空间 80% -76% = 4% 说明这个节点数据多 往别的节点迁移数据
avg=90 + 80 +60 /3 = 76%
生产上 从现在开始 start-balancer.sh -threshold 10 每天要定时做的
放到业务低谷期去做 数据平衡操作
注意: 不要在业务高峰期做
1.数据平衡 数据传输 带宽有关
调优参数 :平衡的网络带宽 w
dfs.datanode.balance.bandwidthPerSec 100m 【2.x 默认是10m】
每个节点数据几十T 需要数据平衡的数据 几十T 可以申请维护窗口时间 :
dfs.datanode.balance.bandwidthPerSec 临时调大 200M
2T 100m =》20s
2T 200M =》 10s
4.单个DN节点 多块磁盘的数据平衡
投产前规划:
DN 机器 10块 2T 【不做raid】 =》 20T 副本的
1.dn 配置多个磁盘
<property>
<name>dfs.datanode.data.dir</name>
<value>/data01,/data02,/data03</value>
</property>
2.为什么要使用多块物理磁盘?
1.存储
2.因为多个磁盘的io也是叠加的
每块磁盘 磁盘io 每秒 100m
三块磁盘 1s 能 300m文件内容
一块磁盘 1s 100m
3https://blog.csdn.net/u011250186/article/details/data01,/data02,/data03
做多个磁盘数据均衡
dfs.disk.balancer.enabled true 【3.x有这个功能 cdh 2.x 也有】 apache 2.x 没有这个功能
得通过命令去解决磁盘数据均衡?
hdfs diskbalancer
步骤
hdfs diskbalancer -plan bigdata32 => 生成一个 bigdata32.plan.json 文件
hdfs diskbalancer -execute bigdata32.plan.json =》 执行disk 数据均衡计划文件
dfs diskbalancer -query bigdata32
生产上 当你发现 磁盘写入不均衡 可以做一下 【一般 一个月 半个月 做一次即可】
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/34878.html