Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1030390
  • 博文数量: 164
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1336
  • 用 户 组: 普通用户
  • 注册时间: 2016-03-11 14:13
个人简介

狂甩酷拽吊炸天

文章分类

全部博文(164)

文章存档

2023年(1)

2022年(3)

2021年(4)

2020年(17)

2019年(37)

2018年(17)

2017年(35)

2016年(50)

分类: 大数据

2019-03-12 20:31:49

Hadoop参数调优
1. 设置合理的槽位数目
在Hadoop中,计算资源是用槽位(slot)表示的。slot分为两种:Map slot和Reduce slot。
2. 调整心跳间隔 
心跳中包含节点资源使用情况、各任务运行状态等信息,如果太小,NameNode需要处理高并发的心跳信息,势必造成不小的压力;如果太大,则空闲的资源不能及时通知NameNode(进而为之分配新的Task),造成资源空闲,进而降低系统吞吐率。
3. 选择合适的压缩算法 
Hadoop通常用于处理I/O密集型应用。对于这样的应用,Map Task会输出大量中间数据,这些数据的读写对用户是透明的,如果能够支持中间数据压缩存储,则会明显提升系统的I/O性能。
4. 启动预读取机制
预读取机制可以有效提高磁盘的I/O读性能。而Hadoop是典型的顺序读系统,采用预读取机制可明显提高HDFS读性能和MapReduce作业执行效率。
5. 设置任务超时时间 
在一些特殊情况下,一个任务可能因为某种原因(如Bug)阻塞了,这会拖慢整个作业的执行进度,甚至可能导致作业无法运行结束。针对此情况,Hadoop增加了任务超时机制。如果一个任务在一定时间间隔内没有汇报进度,则TaskTracker会主动将其杀死,从而在另一个节点上重新启动执行。
6. 提高作业优先级 
HIGH、NORMAL、LOW、MID、DEFAULT
7. Map Task调优 
Map Task的输出结果被暂时存放在一个环形缓冲区,调整环形缓冲区
8. Reduce Task调优 
Reduce Task会启动多个拷贝线程从每个Map Task上读取相应的中间结果。对每个待拷贝的文件,如果文件大小小于一定阈值A,则将其放到内存中,否则以文件的形式存放到磁盘上。如果内存中文件满足一定条件D,则会将这些数据写入磁盘,而当磁盘上文件数目达到io.sort.factor(默认是10)时,进行一次合并。用户可根据自己作业的特点对这些参数进行调优。
9. dfs.namenode.handler.count或mapred.job.tracker.handler.count用于处理RPC的线程数,
默认是10,较大集群,可调大些
10. 文件副本数
11. HDFS中数据block大小


YARN原理:
Yarn作为Hadoop的资源调度框架:
ResourceManager:ResourceManager是master上的进程,负责整个分布式系统的资源管理和调度。他会处理来自client端的请求(包括提交作业/杀死作业);启动/监控Application Master;监控NodeManager的情况。
NodeManager:NodeManager时处在slave节点上的进程,他只负责当前slave节点的资源管理和调度,以及task的运行。他会定期向ResourceManager回报资源/Container的情况(heartbeat);接受来自ResourceManager对于Container的启停命令。
Application Master:每一个提交到集群的作业都会有一个与之对应的Application Master来负责应用程序的管理。他负责进行数据切分;为当前应用程序向ResourceManager去申请资源(也就是Container),并分配给具体的任务;与NodeManager通信,用来启停具体的任务,任务运行在Container中;而任务的监控和容错也是由Application Master来负责的。
container:它包含了Application Master向ResourceManager申请的计算资源,比如说CPU/内存的大小,以及任务运行所需的环境变量和队任务运行情况的描述。   






YARN调优:
1.动态分配资源,减少资源浪费
2.增大作业并行程度
3.给每个任务足够的资源
4.在满足前2个条件下,尽可能的给shuffle预留资源




MapReduce 优化方法
1.合并小文件
在执行 mr 任务前将小文件进行合并,大量的小文件会产生大量的 map 任务,增大 map 任务装载次数,而任务的装载比较耗时,从而导致 mr 运行较慢。
2.减少溢写(spill) 次数
通过调整 io.sort.mb 及 sort.spill.percent 参数值,增大触发spill 的内存上限,减少 spill 次数,从而减少磁盘 IO。
3. 减少合并(merge) 次数
通过调整 io.sort.factor 参数,增大 merge 的文件数目,减少 merge 的次数,从而缩短 mr 处理时间。
4. 在 map 之后, 不影响业务逻辑前提下, 先进行 combine 处理,减少 I/O。
5.合理设置 map 和 reduce 数:两个都不能设置太少,也不能设置太多。太少,会导致 task 等 待,延长处理时间;太多, 会导致 map、 reduce 任务间竞争资源,造成处理超时等错误。
6.合理设置 reduce 端的 buffer
默认情况下,数据达到一个阈值的时候, buffer 中的数据就会写入磁盘,然后 reduce 会从磁盘中获得所有的数据。
7. 采用数据压缩的方式,减少网络 IO 的的时间






数据倾斜:
1.数据倾斜症状:
     A.任务长时间维持在99%(或100%);
     B.查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成(这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多)
     C.某个task发生了OOM,那么基本上也是因为数据倾斜了,task分配的数量实在是太大了!!!所以内存放不下,然后你的task每处理一条数据,还要创建大量的对象。内存爆掉了。
     D.hadoop上某一个区域的数据量要远远大于其他区域。 


2.数据倾斜原因:
    A.key分布不均匀;
    B.业务数据特点
3. 导致数据倾斜的操作:GROUP BY, COUNT DISTINCT(),join
4. 数据倾斜的解决方案:
   A.调整并行度,分散同一个task的不同Key
       在做shuffle操作时,默认使用的HashPartitioner对数据进行分区。并行度设置不合理,会造成大量不同key对应的数据被分配到同一个task上 。(调整并行度;一般是增大并行度,但有时候减少并行度也能达到效果,reduceByKey在第二个参数中指定并行度来)
   B.自定义Partitioner
        使用自定义的Partitioner,将原本被分配到同一个task的不同key分配到不同的task。
   C.将Reduce Join(Common Join)转变成Map Join(设置参数,吧小表的rdd信息放到broadcast中)。
   D.为倾斜(skew)的key增加随机的前/后缀
为数据量特别大的key增加随机的前/后缀,使得原来key相同的数据变为key不同的数据,从而使倾斜的数据集分散到不同的task中(如每个key前加一个随机数和下划线分隔符后第一次聚合,第二次聚合时候通过下划线去掉前缀)
    E. 在hive的etl时候进行数据聚合,把key相同的数据聚合为一条数据,这样就可能不用shuffle了
    F. 使用 Combine 可以大量地减小数据倾斜。在可能的情况下, combine 的目的就是聚合并精简数据。


  




HIVE原理:
Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再Hadoop平台上运行;Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录文件,达到了元数据与数据存储分离的目的;Hive本身不存储数据,它完全依赖HDFS和MapReduce


Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引(hive不存储数据,因此没有索引)




HQL----》转换成mapreduce------》提交任务给hadoop(读取,计算)




Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:
1.SQL词法,语法解析,形成抽象语法树AST Tree:
语法规则文件,定义好词法和语法替换规则即可,Antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。
2.SQL基本组成单元QueryBlock:
AST Tree仍然非常复杂,不够结构化,不方便直接翻译为MapReduce程序,AST Tree转化为QueryBlock就是将SQL进一部抽象和结构化。
QueryBlock是一条SQL最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个QueryBlock就是一个子查询。
3.生成逻辑操作符Operator
Hive最终生成的MapReduce任务,Map阶段和Reduce阶段均由OperatorTree组成。基本的操作符包括TableScanOperator,SelectOperator,FilterOperator,JoinOperator,GroupByOperator,ReduceSinkOperator
4.逻辑层优化器:
大部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MapReduce Job,减少shuffle数据量的目的。
5.OperatorTree生成MapReduce Job的过程
遍历
总结为:
1. Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 
2. 遍历AST Tree,抽象出查询的基本组成单元QueryBlock 
3. 遍历QueryBlock,翻译为执行操作树OperatorTree 
4. 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量 
5. 遍历OperatorTree,翻译为MapReduce任务 
6. 物理层优化器进行MapReduce任务的变换,生成最终的执行计划






HIVE优化:
1.解决数据倾斜问题(慎用count(distinct),count(distinct)容易产生倾斜问题。),找到造成倾斜的key
2.设置合理的map reduce 的task数量 (参数)
3.合并小文件(使用Sequencefile作为表存储格式, 减少reduce的数量, 使用hadoop archive命令把小文件进行归档, 参数)
4.列裁剪,分区裁剪
5.存储格式选择
6.MAP JOIN (小表读入内存,上传至Distributed Cache中,避免了shuffle)
7.模式选择(本地模式 ,并行模式 ,严格模式  参数控制)
8.JVM重用 (减少JVM的启动过程, 参数)
9.推测执行 (参数控制)










阅读(10684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~