常用广告系统开源工具

常用广告系统开源工具

       是否可以用开源工具快速地搭建广告系统?可以肯定的说,基本是可以的。很多重要的模块,如上章所讲的architecture里的模块很多都可以借助开源工具实现。

计算广告学-合约广告系统-常用广告系统开源工具 - quweiprotoss - Koala++s blog

 

       在实际的广告系统中我们会用到很多的开源工具。下面我将分别讲述几个开源开具。基本上所有的大的广告系统公司都要使用Hadoop平台,除了google。Hadoop是广告平台中建模的基础,Hadoop有很多子项目,有的子项目与Hadoop有密切的联系,有的子项目仅是在Hadoop框架体系下深挖出来的一些Idea。简单介绍一下,Hadoop现在核心的项目只剩下来两个,HDFSMapReduce,以前Hadoop有很多子项目,中间两列以前都是Hadoop的子项目,但很多现在都已经独立出来,成为顶级项目了。Hadoop本身是一个大数据的存储和计算的平台。

图中的工具可以分为两类,一类是离线的数据处理,另一类是在线的数据处理。离线的数据处理,常用的是HBase,它是基于Hadoop的列存储数据库,并不是关系型数据库,是NoSql型数据库。和HBase功能相似的数据库有很多,比如google的BigTable,和HBase对应的HyperTableHyperTable是c语言写的工具,效率比HBase高一些,还有Facebook开源的Cassandra。它们都是解决大数据上半结构化存储的问题,在实际的系统中都可能会用到。

       oozie是把Hadoop上的流程控制工具,比如我们每天的日志处理,要等日志收到后,进行各种分析,比如有的进行CTR预测,有的进行Audience Targeting,有的交由BI系统,它们这些分析之间可能有一些依赖关系。Hadoop提供了一个管理这些依赖的工具就是oozie,oozie可以认为是比较底层的,可以用API开发的一个framework,我个人感觉是很不好用,也没看到有多少用人这个工具,但它在设计上比较完善。

Hadoop上有两个很重要的脚本语言,PigHive。它们的作用有些相似,功能都是希望将Hadoop上的非结构化的数据,可以用sql语言的方式来访问和加工。这样在拉一些简单的数据报表时,就不用写MapReduce程序去得到数据,只用写pig或hive的脚本。Pig和Hive的区别是:如果你的数据是用分隔符分好的数据,你就可以写Pig脚本直接访问了,所以用起来比较直接方便。而Hive需要预先加工,建立类似于Index的数据才可以操作。所以Pig更接近于程序员的习惯,Hive更适合做BI的习惯。

Mahout是一个在Hadoop上用Map/Reduce做数据挖掘,机器学习的工具,我个人感觉除了几个算法外,其它的算法并不太好用。但这也是机器学习算法的本质决定的,机器学习算法需要根据数据和实际情况做调整,加工,所以如果不了解内部实现,调整模型比较麻烦。

在线部分,最常用的是ZooKeeperZooKeeper是分布式环境下解决一致性问题的开源解决方案,它对应的是更有名的Google的ChubbyZooKeeper和Chubby的理论基础不完全一致。Chubby是严格按照Paxos算法来实现的,Paxos是Lamport是提出的解决分布式环境下的一致性问题的一个完备的算法,而ZooKeeper是这个算法的简化版,它把Paxos简化成两段式提交后实现的一个版本,无法在理论上证明它是正确的,但实践中没有问题,这个是我们在做在线服务中经常要用到的一个工具。

Avro知道的人可能并不多,因为并不常用它,常用的是Facebook的Thrift,它解决的是分布式环境里的跨语言通信的问题,非常好用,而Avro仅是Hadoop的作者实现的一个代替产品,Google的ProtoBuffer也是类似的工具。

S4类比于更常用的Twitter的Storm,是我们上章Architecture里的流式计算平台,进行日志快速处理反馈的一个计算平台。S4是最早Yahoo!用于搜索广告系统分析目的而开发的,Storm是为了满足Twitter上一些快速的计算任务,比如快速计算Fans数,Repost数。两种有一定不同,S4主要优化的是吞吐量,它完全不用磁盘,而Storm还要用到少量的磁盘操作,因为它要保证数据的一致性,保证每一条数据至少被处理一次,但它不保证仅被处理一次。

Chuhwa对应的是Facebook的Scribe,它是上章Architecture里提到的Data Highway,它是分布式的日志收集工具,一个广告系统有很多的广告投放引擎,这些投放引擎,Data Highway准实时地把多个服务器的日志准实时地都收集到一起,准实时地投到Hadoop或是Storm上,现在还有一个常用的是Flume。

Elephant-Bird是一个有意思的小工具,它是配合Pig使用的,如果我们的系统中大量使用Thrift或是ProtoBuffer,它的结构都是序列化的,二进制的,你用Pig无法直接访问,Twitter为了解决这个问题提供了Elephant-Bird工具,使用Elephant-Bird后,Pig就可以直接访问序列化的数据了。

图中有阴影的表示是我个人感觉好用的工具,但仅代表我个人观点。在这里我也想介绍一点我个人对开源社区的一些看法,现在开源社区已经和若干年前已经完全不同,现在不再是一个质量不能保证,内容比较芜杂的环境了。原因是有很多大公司在不遗余力地在支持开源项目,比较典型的是Twitter,Yahoo!,Facebook。我们认为开源工具可选的原因是这些工具是在Twitter,Facebook这种数据量上进行验证的,而其它公司很难有真实的环境去测试这种大规模数据的,比如Facebook在测试Scribe的时候,数据达到过每秒10T,所以开源工具的质量和可靠性非常高。

跨语言服务搭建工具

       在搭建一个广告系统的时候,遇到的第一个问题可能就是多模块的语言不统一,Facebook在这方面是比较开放的,它提供了一个工具Thrift,它允许工程师各自喜欢或是习惯的语言去开发,Thift就是一个跨语言服务快速搭建的工具。它的使用方法非常简单,第一步是用struct定义语言无关的通信数据结构,用IDL语言描述,比如下面的KV,它有两个字段一个是32位int类型的key,一个是string类型的value。Thrift会将IDL语言的定义转为你所需要的语言(比如c语言)的定义。

struct KV

{

1:optional i32 key=10;

2:optional string value=“x”

}

搭建服务也是在IDL文件里写,比如KVCache是存KV pair的一个服务,它有几个接口,set,get和delete,这些定义都是语言无关的,你根据定义实现自己的逻辑。

service KVCache

{

void set(1:i32 key, 2:string value);

    string get(1:32 key); void delete(1:i32 key);

}

如果不是进行特殊的协议层优化,Thrift就可以满足需求了。并且它能实现结构和接口的向后兼容(backward compatible),类型的工具有Hadoop的Avro和google的ProtoBuffer。

版权声明:本文为94julia原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/94julia/p/4608223.html