Hadoop day08 (Yarn)

  • 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的压缩
        • bzip2\gzip 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

          • 3./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

              生产上 当你发现 磁盘写入不均衡 可以做一下 【一般 一个月 半个月 做一次即可】


               

​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值