标签 C++ 下的文章

Hadoop pipes 是 Hadoop MapReduce 的 C++ 的接口代称。不同于使用标准输入和输出来实现 map 代码和reduce 代码之间的 Streaming。Pipes 使用套接字 socket 作为 tasktracker 与 C++版本函数的进程间的通讯,与 Streaming 不同,Pipes 是 Socket 通讯,Streaming 是标准输入输出。

1、Pipes架构设计
Hadoop-pipes-arch.jpg

Hadoop pipes允许用户用C++编写五个基本组件:mapper,reducer,partitioner,combiner,recordReader,这五个组件可以是Java编写的,也可以是C++编写的。

2、Mapper编写

#include "Pipes.hh"
#include "TemplateFactory.hh"
#include "StringUtils.hh"

class UBCMapper : public HadoopPipes::Mapper {
public:
    UBCMapper(HadoopPipes::TaskContext &context) {
    }
    void map(HadoopPipes::MapContext &context) {
        // 获取input中的一行数据
        std::string line = context.getInputValue();
        std::vector<std::string> split = HadoopUtils::splitString(line, "\t");
        if (split.size() == 8) {
            // 转化成新的keys-value
            context.emit(split[3], split[2]);
        }
    }
};

HadoopUtils提供了丰富的工具函数,包括字符串分割、字符串数值互转等。这里需要注意的是,字符串数值互转只支持32位长度,如果数值字符串长度较长,使用HadoopUtils转换会溢出,推荐使用boost将字符转为int64_t:

// string=>uint64_t
boost::lexical_cast<uint64_t>(str)
// uint64_t=>string
 std::stringstream ss;
ss << count;
std::cout<<ss.str();

- 阅读剩余部分 -

最近微软的How-Old刷爆了朋友圈,这是一次学术研究与日常生活的结合。实际上还有许多研究与我们密切相关,比如我的研究方向——图像运动复原,可以将该技术应用于相机抖动图像的恢复。然而PC端软件日趋衰落,移动端使用量逐步增长,由于手机处理能力有限,而图像恢复技术需要很大的CPU与内存资源,将该算法部署在云端,所有处理都在云端进行,手机负责传输图像,那么该问题轻松解决。

实施方案:
(1)核心算法:C/C++实现,支持GPU加速,性能指标:10s内处理5000*5000分辨率图像;
(2)交互设计:WEB方式,接收、返回处理结果,实施技术JSP或Python

项目架构:
(1)WEB(Python OR JSP)作为前台访问,底层使用C/C++实现核心算法;
(2)考虑到移动设备处理能力有限,软件维护的代价,以web/host方式较为合理;
(3)后期考虑开发API接口;

技术细节:
(1)流量成本:移动端图像高质量压缩,再减少流量传输同时,尽量保存图像细节;
(2)项目部署:云端

该系列主要总结了使用C++来实现各种设计模式,并结合实际的案例来分析如何使用,以及在什么场合下使用设计模式。以下是该系列所有文章的链接。希望对大家有帮助。

C++设计模式——简单工厂模式
C++设计模式——工厂方法模式
C++设计模式——抽象工厂模式
C++设计模式——单例模式
C++设计模式——建造者模式

- 阅读剩余部分 -