`
085567
  • 浏览: 220431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hadoop 优化

阅读更多
从三个方面着手优化 :
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的优化.docx

    Hadoop 优化 Hadoop 作为大数据处理的核心技术,优化其性能是非常重要的。本文将总结 Hadoop 的优化技术,涵盖 MapReduce、Hive、Linux 层面的优化技术。 一、Hardware 配置优化 在 Hadoop 集群中,硬件配置的...

    hadoop优化.md

    Hadoop优化以及MR跑的慢的原因和MR优化的一些方法,Hadoop对于小文件的优化方法,以及一些解决方案

    Hadoop平台性能优化

    Hadoop平台的性能优化研究涉及了如何在大型分布式系统中提升任务处理速度和效率,这对于当前数据密集型应用的发展至关重要。本文将从以下几个关键点详细解读Hadoop平台性能优化的知识点。 首先,了解Hadoop平台的...

    Hadoop平台优化文献综述.docx

    最后,绿色计算的观念也被引入到Hadoop优化中,研究如何在保证处理性能的同时,降低能耗,实现可持续的数据处理。 总的来说,Hadoop平台的优化涵盖了从应用程序、系统参数、架构设计到算法改进等多个层面,未来的...

    实战hadoop中的源码

    5. **Hadoop优化**:通过源码学习如何调整配置参数,提高数据处理速度和系统稳定性。 6. **容错机制**:理解Hadoop的故障恢复机制,如检查点、数据冗余和故障检测。 7. **扩展性与插件开发**:学习如何为Hadoop...

    hadoop高级应用一

    8. **Hadoop优化**:包括配置参数调整、I/O优化、网络优化等,提升系统性能。 9. **实时处理与流处理**:例如使用Storm或Spark Streaming进行实时数据处理,适应现代大数据应用场景。 10. **Hadoop在实际业务中的...

    Hadoop入门到精通

    七、Hadoop优化 随着数据量的增长,优化Hadoop集群的性能成为必要。这包括调整数据块大小、设置合适的副本数量、优化MapReduce的槽位设置、使用YARN进行资源调度等。 八、Hadoop与大数据处理 在大数据时代,Hadoop...

    hadoop-3.1.3-src.tar.gz

    - **Hadoop优化**:包括配置优化、数据本地化、网络优化等,提升Hadoop集群的性能。 - **YARN应用管理器**:如YARN的ApplicationMaster,负责应用程序的生命周期管理和资源调度。 6. **安全与认证** - **...

    hadoop-lzo-0.4.21-SNAPSHOT jars

    而Hadoop-LZO则是针对Hadoop优化的一种数据压缩库,旨在提高HDFS(Hadoop Distributed File System)上的数据压缩效率和读写性能。这个压缩库是由Groupon开发并维护的,它实现了LZO(Lempel-Ziv-Oberhumer)压缩算法...

    hadoop高级应用三

    5. **Hadoop优化与性能调优**:这涉及到对HDFS配置参数的调整,如副本数、块大小,以及MapReduce的参数优化,如Map和Reduce任务的数量、内存分配等,以提高整体系统性能。 6. **Hadoop的云部署与混合云**:随着...

    Hadoop运行原理分析pdf

    7. **Hadoop优化**:包括硬件配置、数据局部性、MapReduce参数调优、任务调度策略等,这些都能显著提升Hadoop的性能。 8. **Hadoop的应用场景**:Hadoop广泛应用于互联网日志分析、推荐系统、图像处理、基因序列...

    Hadoop Real-World Solutions Cookbook 源代码

    7. **Chap 8 - Hadoop优化与故障排除**:这部分内容可能涉及Hadoop集群的性能调优,如调整配置参数,以及如何诊断和解决常见的运行时问题。 8. **Chap 10 - 大数据可视化与报告**:可能介绍了如何将Hadoop处理的...

    Hadoop海量数据处理

    7. **Hadoop优化**:包括硬件选择、数据分布策略、I/O优化、内存调优等方面的技巧,以提升Hadoop集群的性能和效率。 8. **Hadoop安全**:讨论了Hadoop的安全性问题,包括认证、授权和审计,以及如何通过Kerberos等...

    中国移动hadoop运用.pdf

    1. **硬件性能优化**:采用专为Hadoop优化的英特尔至强TM5600系列通用计算平台替代原有的RISC平台,实现了成本降低和性能提升。 2. **近实时数据分析**:借助英特尔Hadoop发行版,消除了数据访问瓶颈,深入洞察用户...

    hadoop实战开发PDF

    7. **Hadoop优化**:讨论性能调优策略,包括配置参数调整、数据本地化、作业并行度控制等。 8. **Hadoop扩展组件**:介绍Hadoop生态中的其他组件,如HBase(分布式数据库)、Hive(数据仓库工具)、Pig(数据分析...

    Hadoop开发者入门-带书签文字版

    8. **Hadoop优化**:了解如何通过调整HDFS参数、MapReduce配置和硬件设置来优化Hadoop的性能。 9. **Hadoop与其他技术的集成**:Hadoop常与其他大数据技术如Hive(SQL查询工具)、Pig(数据分析工具)和Spark(高...

    Hadoop进行分布式计算的入门资料

    - Hadoop优化:包括数据倾斜问题的解决、内存和磁盘使用策略的调整等。 六、实战应用 通过实际项目来巩固理论知识,例如建立一个日志分析系统,使用Hadoop处理网络日志,提取用户行为信息,进行用户画像构建或异常...

    Hadoop安装部署及教学

    四、Hadoop优化 1. 内存配置:合理分配MapReduce的内存资源,避免溢出问题。 2. 并发度调整:根据硬件资源调整Map和Reduce任务的数量,提高处理速度。 3. 数据本地化:通过调整策略,让数据尽可能在产生它的节点上...

    4703031《Hadoop大数据处理实战》(康开锋)423-1资源包.rar

    8. **Hadoop优化**:包括MapReduce性能调优、HDFS参数调整、JobTracker和TaskTracker的优化等,以提高数据处理效率。 9. **案例分析**:书中可能包含各种实际案例,如日志分析、推荐系统、社交网络分析等,通过这些...

    hadoop 1.0.3安装包

    11. **Hadoop优化**:随着对Hadoop的理解加深,可能需要进行性能优化,包括调整副本数量、内存分配、网络带宽利用等。 通过上述步骤,你就可以在本地或者集群环境中成功安装并运行Hadoop 1.0.3了。在学习过程中,...

Global site tag (gtag.js) - Google Analytics