基于C++的MapReduce实现(HCE)
2015-04-02 10:00
316 查看
hadoop概念
Hadoop系统提供了MapReduce计算框架的开源实现,像Yahoo!、Facebook、淘宝、中移动、百度、腾讯等公司都在借助Hadoop进行海量数据处理。Hadoop系统性能不仅取决于任务调度器的分配策略,还受到分配后实际任务执行效率的影响,任务执行常常涉及读取、排序、归并、压缩、写入等具体阶段。百度写的一篇关于Hadoop的C++扩展.pdf
http://www.open-open.com/doc/view/08a23a4b7fcb4f23b7a064aeb416ae0a
HCE概念
HCE, short for Hadoop c++ extension换句话说就是Hadoop在C++上面的扩展
由百度开发的Hadoop MapReduce C++扩展框架,其诞生源于baidu/dpf组对Hadoop MapReduce稳定性、扩展性和高效率的追求。HCE将MapReduce任务的执行迁移到C++环境,从而可以避免java虚拟机由于GC机制以及JNI调用所产生的不必要内存和性能开销,提供更加精确的内存控制。同时,HCE提供了可与hadoop原生java接口想媲美的API,使得用户可以方便的编写HCE的Map和Reduce任务。
HCE计算框架
HCE计算框架是一个开源项目,旨在通过优化任务执行的各个阶段,提升整个Hadoop系统的效率。与Hadoop Java框架相比,基于HCE框架的MapReduce任务最高可以节省超过30%的CPU资源使用。Hadoop Streaming 和 Pipes框架支持C++用户开发MapReduce程序。框架启动用户可执行程序,框架和用户程序分别处于两个进程,分别占用资源。简单的分析程序不会占用太多的CPU资源,即用户程序在整个计算任务执行时间中所占比例不大,此时,优化计算框架会带来比较可观的收益;不过,对于复杂的分析程序而言,用户程序所占时间远远超过计算框架,此时,优化计算框架带来的收益可能微乎其微。因此,节省集群CPU资源离不开优化用户程序。
静态优化与动态优化
动态优化是在MapReduce上新增一个层,通过profiler和sampler等技术动态调整作业参数
静态优化
让用户用编译时依赖框架提供的头文件和库文件,通过编译优化技术提升用户程序性能。
HCE采用的是静态优化
计算框架高效C++实现
HCE框架通过C++语言实现了MapReduce的数据处理逻辑,依托比Java性能更优的C++语言,可以在数据处理操作上获得更佳的CPU利用率,同时也可以更加直接地调用Native Lib而非通过JNI(注:压缩库是Native实现,Hadoop通过JNI来调用压缩方法,HCE压缩在一个进程空间执行);此外,通过高效的编译优化方法,例如ICC编译器等,可以进一步挖掘框架的性能优势。HCE框架通过精简的方式实现了MapReduce的数据处理流程,比较多层次的Java流式封装,HCE的处理流程更加高效。
HCE框架提供了多种语言接口C++、Python等,方便了用户编程,也节省了Streaming接口的额外开销;同时HCE也提供完全兼容原有Java Streaming的接口,即原有作业可以无缝迁移到HCE框架。
HCE程序框架
HCE框架的数据处理流程,可以看出HCE框架在C++空间高效实现了多个可扩展的功能模块,如RecordReader、OutputCollector、Shuffle、ReduceInputReader、RecordWriter、Committer、Partitioner、Mapper、Reducer、Combiner等,处理逻辑比Hadoop MapReduce更加紧凑高效。处于Hadoop Java空间的MapRunner和ReduceRunner只是起到收集状态信息的作用。
HCE框架的性能提升主要集中在Map阶段,大约超过40%。对于一般的MapReduce程序,相比Shuffle和Reduce阶段,Map阶段也是其资源占用最多的阶段,因为最终作业的输出一般仅仅是输入的10%,大量的数据处理是在Map阶段完成的。
相关资源
下载相关资源十分重要的地址https://issues.apache.org/jira/browse/MAPREDUCE-1270
HCE 教程指导
http://download.csdn.net/detail/hit_090420216/8557653
HCE安装手册
http://download.csdn.net/detail/hit_090420216/8557647
参考内容
/article/10121577.html/article/7753791.html
/article/4287055.html
相关文章推荐
- 实现基于C++的动态事件机制
- 基于c++进程注入的实现
- 用 C++ 实现基于 session 的权限管理系统
- C++ 基于 Visual C++6.0 的 DLL 编程实现
- 基于mapreduce的 Hadoop join 实现分析(二)
- 基于ACE实现C++目录遍历
- 基于visual c++之windows核心编程代码分析(53)在C++中嵌入汇编实现DLL注入源代码
- 基于C++有限状态机的实现技术(调查报告)
- 基于OPENGL使用C++实现相机类
- C++实现的带最大最小线程数的线程池(基于ACE)
- VC++编译问题汇总1 单链表的表示和实现,基于c++
- 连通区域标记:c++版的bwlabel实现(基于opencv)
- C++实现的带最大最小线程数的线程池(基于ACE)
- 基于数组实现双向栈 c++
- 基于Windows Socket的安全通信(C++实现,附源码)
- Ajax - JavaScript之实现私有属性、像C++和Java一样支持基于类的继承方法之例子
- C++实现的huffman与canonical huffman的压缩解压缩系统,支持基于单词的压缩解压缩
- C++基于链表泛型集合类的实现
- 基于mapreduce的Hadoop join实现
- 基于mapreduce的购物篮分析算法实现