- 浏览: 128807 次
- 性别:
- 来自: 北京
文章分类
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://luobeng.blogbus.com/logs/105014767.html
5月19日
hadoop/mapred优化方法.V004
欢迎拍砖.
***某些方法, 会导致程序可维护性会降低***
从三个方面着手优化 :
1. hadoop配置
2. 设计mapred/job
3. 代码级别.
4. 改造hadoop
一. conf/hadoop-site.xml配置.
经验要求高, 特别需要结合实际情况.
典型参数如
复制因子,
mapred.child.java.opts,
mapred.tasktracker.map.tasks.maximum,
mapred.tasktracker.reduce.tasks.maximum,
mapred.map.tasks,
mapred.reduce.tasks,
fs.inmemory.size.mb,
dfs.block.size
等等
二. 在同一个job内完成尽可能多的计算任务, 主要是设计key和自定义OutputFormat, 将能合并的计算任务合并.
举例 : 用户访问行为(userid, ip, cookie), 分别统计每个用户的ip数和cookie数.
最简单的设计, 是使用量个job, 分别计算ip数和cookie数.但是我们可以按照下面的思路, 在一个job中完成这两项计算 :
(a). 把userid和字段存储到key中
public class UserKey implements WritableComparable{
int userId;//useridbyte field;//0代表ip, 1代表cookie@Overridepublic int compareTo(UserKey o) {if(userId > o.userId)return 1;if(userId < o.userId)return -1;if(field > o.field)return 1;if(field < o.field)return -1;return 0;}@Overridepublic void readFields(DataInput in) throws IOException {// TODO Auto-generated method stub}@Overridepublic void write(DataOutput out) throws IOException {// TODO Auto-generated method stub}
}
(b). 实现自定义的OutputFormat, 下面是两处关键代码如下 :
(x).
SequenceFile.Writer[] writers = new SequenceFile.Writer[2];
writers[0] =
SequenceFile.createWriter(FileSystem.get(conf), conf, "ip", IntWritable.class, IntWritable.class, CompressionType.BLOCK, new DefaultCodec());
writers[1] =
SequenceFile.createWriter(FileSystem.get(conf), conf, "field", IntWritable.class, IntWritable.class, CompressionType.BLOCK, new DefaultCodec());
(xx).
writers[key.field].append(key.userId, value.get());
三. 避免不必要的reduce任务.
(1). 假定要处理的数据是排序且已经分区的. 或者对于一份数据, 需要多次处理, 可以先排序分区.
(2). 自定义InputSplit, 将单个分区作为单个mapred的输入.
(3). 在map中处理数据, Reducer设置为空.
这样, 既重用了已有的 "排序", 也避免了多余的reduce任务.
四. 使用自定义的MapRunnable.
hadoop自带了两个MapRunnable,
(1). 一个是默认的单线程MapRunnable, org.apache.hadoop.mapred.MapRunner
(2).另一个是多线程的, org.apache.hadoop.mapred.lib.MultithreadedMapRunner.
根据特定情况, 可以自定义MapRunnable,
(1). 启用多线程, 比如web爬行时, 可启用多线程抓取网页.
(2). 避免map时, 单台tasktracker上辅助数据冗余, 比如在多模匹配时, 避免生成多份DFA.
五. 在某些情况下, 利用数据分布特性设计PARTITIONER的分区算法, 避免单个mapred消耗时间过长.
这跟木桶原理有些神似.
比如处理大量字符串时,
(1). 已知首字不同的字符串之间不存在任何关联关系
(2). 原始数据在某些 "首字" 上分布密集, 另一些 "首字" 上分布稀疏.
例如, 原始数据中, 1亿个以3开头, 1亿个以7开头, 3个以6开头.
那么,
(1). 如果以首字对4求余分区, 则 "1亿个以3开头" 和 "1亿个以7开头"将落在同一分区.若hadoop群集只支持同时2个map任务, 则...
(2). 如果以首字对3求余分区, 则 "1亿个以3开头" 和 "1亿个以7开头"将落在不同分区.
六. 最大限度地重用对象, 避免对象的生成/销毁开销.
该点在hadoop自带的org.apache.hadoop.mapred.MapRunner中尤为突出,
它使用同一个key对象和同一个value对象不停读取原始数据, 再将自身交给mapper处理.
(此处注意, 若要保留该对象的即时状态, 需要clone, 深克隆或浅克隆.)
七. 在逻辑意义上, 合并同一对象. 如dotnet和java中的字符串INTERN技术.
八. 根据已有条件, 简化循环判定.
比如, for(int i = 0; i < end && i < size; i++);
可以改成 :
end = end < size ? end : size;
for(int i = 0; i < end; i++);
九. 降低多线程数目, 而让固定数目的线程循环处理.
比如, 一台机器8个CPU, 现在需要处理80亿个数据,
那么下面两个方案 :
(1). 启动800个线程, 每个线程处理80亿/800个数据.
(2). 启动8个线程(注意, 此处是8个), 每个线程循环处理, 每次循环处理100万个.
通常我个人选择方案(2).因为 :
(1). 最大限度利用了CPU.
(2). 避免了线程调度.
(3). 在java中, 可以使用AtomicInteger控制线程循环, AtomicInteger的效率很高.
(4). 有时, 还可以避免单个线程消耗时间过长.
十. 使用位移替代浮点数计算. 比如用 100 >> 3替代100 * 0.125.
(另外, 我们会需要将某个中间值乘以一个调节因子(经验值), 比如乘以0.12,
如果乘以0.12和0.124 "差不多" 时, 可以考虑直接使用位移).
十一. 避免循环体内不必要的判断逻辑, 与第八条不同.
比如, 处理10亿个数据, 每遇到一个有效数据时, 需要同前一个有效数据进行关联处理(或与前一个中间值进行关联处理),
for(int i = 0; i < size; i++)
{
//1. 判定是否存在前一个有效数据
//2. 如果不存在前一个有效数据, 则continue;
//3. 如果存在前一个有效数据, 则进行关联处理, 再continue.
}
通常在此种需求下, 一旦遇到一个有效数据, 必定会产生一个可供后续紧邻数据关联的值,
那么 :
int i = 0;
for(int i = 0; i < size; i++)
{
//1. data[i]是否有效?
//2. data[i]无效, continue;
//3. data[i]有效, break;
}
for(; i < size; i++)
{
//与前一个有效数据进行关联处理, 再continue.
}
十二. 方法调用过程, 辅助数据尽量放在方法体内, 避免使用全局辅助数据, 一来节省内存, 二来提高对象可重用性.
十三. 尽量不要生成转瞬即逝的对象, 或者专门构建专属对像来完成这一任务.
比如 :
1). 提供直接使用构造函数参数进行序列化的静态方法, 避免先使用参数构造对象再进行序列化.
2). 参考上述第六点.
十四. 利用-1 和 1的关联性, 减少内存使用量, 或携带更多的信息.
比如java.util.Arrays.binarySearch方法的返回值.
十五. 对于方方正正的多位数组Arr[d0][d1][d2]..[dn], 且di >> d(i+1)时, 可以考虑使用一维数组替代, 减少对象.
这是因为java中多位数组实际上使用 "数组的数组" 实现的.
十六. 尽量使key的WritableComparable性能最佳, 尽量使value的Writable性能最佳.
比如使用掩码操作.
十七. 尽早丢弃无关对象.
见 "使用hadoop/mapred的典型计数问题".
十八. 改造hadoop, 使merge过程更具弹性, 或更符合实际需求.
比如 :
1). 使reduce的中的values按照顺序迭代.
2). 见 "使用hadoop/mapred的典型计数问题".
十九. 有效设计mapred中的combiner, 尽早降低I/O等操作.
此过程中, 可以结合自定义OutputFormat, 使得同一个Recuder类可同时充当map->merge->reduce中的后两个过程.
见 "使用hadoop/mapred的典型计数问题".
发表评论
-
HDFS架构简介
2012-07-17 15:02 1612转自:http://asyty-cp.blog.163.com ... -
Hadoop Dont's: What not to do to harvest Hadoop's full potential
2012-07-15 15:45 694We've all heard this story. ... -
hadoop-0.20.203启用LZO压缩 安装成功
2012-07-13 18:10 2599#准备各安装包,并scp到各节点 pwd /work/lz ... -
Hadoop TaskScheduler浅析
2012-07-13 14:01 891转自:http://hi.baidu.com/_kouu/bl ... -
Hadoop OutputFormat浅析
2012-07-13 14:00 2167转自:http://hi.baidu.com/_kouu/bl ... -
Hadoop InputFormat浅析
2012-07-13 13:57 889在执行一个Job的时候,Hadoop会将输入数据划分成N个Sp ... -
hadoop面试可能遇到的问题
2012-07-13 13:50 1145Q1. Name the most common Inpu ... -
hadoop-0.20.203启用LZO压缩
2012-07-12 16:45 14921.准备工作,安装ant,(编译第三步lzo编码解码时使用,现 ... -
24 Interview Questions & Answers for Hadoop MapReduce developers
2012-07-12 10:12 732A good understanding of Hadoop ... -
hadoop hbase log backup
2012-06-28 16:43 847hadoop hbase logs目录下日志越来越多,写个简单 ... -
Hadoop Job失败解决
2012-06-27 17:07 3059现象:map 某个task始终实行失败,直到超时,attemp ... -
Hadoop的那些事儿
2012-06-25 14:37 674在说Hadoop之前,作为一个铁杆粉丝先粉一下Googl ... -
Hadoop学习总结:Map-Reduce的过程解析
2012-06-25 10:47 803一、客户端 Map-Re ... -
Hadoop集群上使用Lzo压缩
2012-06-21 14:14 1049自从Hadoop集群搭建以来,我们一直使用的是G ... -
hadoop 相关博客推荐
2012-06-04 10:26 815http://www.cnblogs.com/xuqiang/ ... -
hdfs小文件问题
2012-06-04 10:23 735http://www.cloudera.com/blog/20 ... -
hadoop tuning blog
2012-05-24 14:16 8697 Tips for Improving MapReduce ... -
hadoop作业调优参数整理及原理
2012-05-24 13:58 729转自:http://www.tbdata.org/archiv ... -
Kerberos authentication
2012-05-19 21:46 1387转自:http://www.sunchangming.com/ ... -
关于 hadoop slot的一篇转载
2012-05-17 17:12 873版权声明:转载时请以超链接形式标明文章原始出处和作者 ...
相关推荐
Hadoop优化以及MR跑的慢的原因和MR优化的一些方法,Hadoop对于小文件的优化方法,以及一些解决方案
本文分析Hadoop平台存在的局限和不足,提出一个解决方案,充分利用任务和I/O的多重并发,平衡磁盘和网络带宽,减少瓶颈出现的可能性,提高系统性能。
hadoop学习过程中的调优总结,Mapreduce/hive相关的调优,Linux层面的一些调优,Mr/hive 的调优
Hadoop集群高可用与性能优化
在给出Hadoop系统基本框架的基础上,阐述了MapReduce并行计算框架优化、作业调度优化、HDFS性能优化、HBase性能优化和Hadoop功能增强等研究现状,分析已有技术的优势和不足,并探讨了未来的研究方向.
hadoop高可用集群搭建及参数优化hadoop高可用集群搭建及参数优化hadoop高可用集群搭建及参数优化
大数据技术之Hadoop(优化&新特性).doc详细文档
dfs.datanode.du.reserved - 磁盘满了导致的问题很难预料,HDFS可能会导致部分数据写入异常,MySQL可能会出现直接宕机等等, 所以最好的办法就是:不要使盘的利用率达到100%。 - 数据存储周期规划好,定期清理...
Hadoop平台的性能优化研究从cnki上下的资料Hadoop平台的性能优化研究Hadoop平台的性能优化研究Hadoop平台的性能优化研究Hadoop平台的性能优化研究Hadoop平台的性能优化研究Hadoop平台的性能优化研究
Hadoop 性能优化研究 对研究hadoop的人进行性能优化有一定的帮助
Hive Hadoop Spark优化
hadoop调优指南
Hadoop集群性能优化技术研究Hadoop集群性能优化技术研究
基于Hadoop框架的大数据集连接优化算法
Cloudera Hadoop 5&Hadoop高阶管理及调优课程,完整版,提供课件...2、搭建本地Yum部署CDH5的重要组件和优化配置 3、Impala、Oozie和Hue的部署、使用操作及调优 4、Hadoop安全认证及授权管理 5、Hadoop各组件性能调优
Hadoop在相似度计算中的优化_林述民
本文首先介绍了Hadoop平台的背景,包括它在技术背景上的产生与发展,在应用背景上的应用与前景。之后对 Hadoop的关键技术 HDFS、MapReduce和Scheduler进行研究分析。在此研究基础之上,本文指出MapReduce应用可在程序、...
Hadoop Namenode性能诊断及优化
hadoop yarn优化配置项生成工具,需要安装python环境,执行例如:python yarn-utils.py -c 24 -m 256 -d 4