`

Hadoop/MapReduce 优化方案

阅读更多

从三个方面着手优化 :

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<UserKey>{

 

    int userId;//userid

    byte field;//0 代表ip, 1代表cookie

    @Override

    public 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;

 

    }

    @Override

    public void readFields(DataInput in) throws IOException {

    // TODO Auto-generated method stub

    }

    @Override

    public 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的<key, values>中的values按照顺序迭代.

2). 见 "使用hadoop/mapred的典型计数问题".

 

十九. 有效设计mapred中的combiner, 尽早降低I/O等操作.

此过程中, 可以结合自定义OutputFormat, 使得同一个Recuder类可同时充当map->merge->reduce中的后两个过程.

见 "使用hadoop/mapred的典型计数问题".

分享到:
评论

相关推荐

    数据算法 Hadoop Spark大数据处理技巧

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    HCIE-Big Data-Data Mining V2.0 考试大纲.pdf

    Hadoop/HDFS/Zookeeper/HBase/MapReduce/Yarn/Hive/Flink/Flume/Kafka/Loader/ElasticSearch/R edis) 数据预处理 特征选择与降维 有监督学习 无监督学习 模型评估与优化 数据挖掘综合应用 Spark MLlib 数据挖掘 ...

    hadoop的优化.docx

    hadoop学习过程中的调优总结,Mapreduce/hive相关的调优,Linux层面的一些调优,Mr/hive 的调优

    数据算法 Hadoop Spark大数据处理技巧.pdf

    Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和Spark。, 主要...

    数据算法 Hadoop Spark大数据处理技巧 中文PDF

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    数据算法 Hadoop Spark大数据处理技巧 中文完整版 高清带书签

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    数据算法 hadoop spark大数据处理技巧

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    HadoopSpark大数据处理技巧[中文版][高清]

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    Hadoop实战(第2版)

     《Hadoop硬实战》包含: ·Hadoop和MapReduce的基本概念 ·85个实战和测试技术 ·真实的场景,实用的解决方案 ·如何整合MapReduce和R前言 致谢关于本书 第1 部分 背景和基本原理1 跳跃中的Hadoop1.1 什么...

    alibabacloud-jindofs:阿里云jindo-sdk

    JindoFS作为阿里云基于OSS的一揽子数据湖存储优化方案,完全兼容Hadoop / Spark生态,并针对Spark,Hive,Flink,Presto等大数据组件和AI生态实现扩展和优化。JindoFS项目包括JindoFS OSS支持,JindoFS分布式缓存...

    《数据算法Hadoop Spark大数据处理技巧》PDF 带目录!!

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    论文研究-基于资源签名与遗传算法的Hadoop参数自动调优系统.pdf

    该系统利用MapReduce作业的小规模数据集资源签名将任务分类,在遗传算法框架中通过任务的测试评估对配置方案进行自动迭代优化。实验结果表明,调优后集群的任务完成时间明显缩减,集群的资源利用率有了明显提升。

    利用Hive进行复杂用户行为大数据分析及优化案例

    利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件+代码+讲义+工具软件),具体内容包括: 01_自动批量加载数据到hive 02_Hive表批量加载数据的脚本实现(一) 03_Hive表批量加载数据的脚本实现(二) ...

    用于Hadoop平台的混沌加密研究与实现

    该方案运用MapReduce并行框架和混沌加密伪随机数以及初值敏感的原理,提出一种针对MapReduce框架和混沌加密优化的并行混沌加密方案,即用明文长度作为初值,分别对Chen、Lorenz、Rssler三种超混沌系统进行初始迭代...

    数据算法 Hadoop_Spark大数据处理技巧 ,马哈默德·帕瑞斯安 ,P680 ,2016.10.pdf

    本书介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这本书还概要介绍了MapReduce、Hadoop和Spark。

    大数据开发实战:SparkStreaming流计算开发

    Spark本质上是对Hadoop特别是MapReduce的补充、优化和完善,尤其是数据处理速度、易用性、迭代计算和复杂数据分析等方面。SparkStreaming作为Spark整体解决方案中实时数据处理部分,本质上仍然是基于Spark的弹性...

    除Hadoop外的9个大数据技术分析盘点

    Hadoop是大数据领域最流行的技术,但并非唯一。还有很多其他技术可用于解决大数据问题。除了ApacheHadoop外,另外9个大数据技术也...它具有分布式MapReduce一类平台的高效性、灵活性和扩展性以及并行数据库查询优化方案

Global site tag (gtag.js) - Google Analytics