合约广告系统-Hadoop

Hadoop

Hadoop 概况

Hadoop 由 Apache Software Foundation 公司于 2005 年秋天作为Lucene的子项目 Nutch的一部分正式引入。它受到最先由 Google Lab 开发的 Map/Reduce 和 Google File System(GFS) 的启发。Yahoo! 是最主要源代码贡献者, 贡献了大约80%的代码,Powerset写的HBase, Facebook 写的Hive都是Hadoop上很重要的子项目。Hadoop的使用异常广泛,凡是涉及大数据处理的互联网公司几乎都使用Hadoop,已知为接近150家的大型组织实际使用: Yahoo!, Amazon, EBay, AOL, Google, IBM, Facebook, Twitter, Baidu, Alibaba, Tencent。在这里可以看到一些使用Hadoop的公司。

Hadoop目标可以概括为:可扩展性: Petabytes (1015 Bytes) 级别的数据量, 数千个节点,经济性: 利用商品级(commodity)硬件完成海量数据存储和计算,可靠性: 在大规模集群上提供应用级别的可靠性。

Hadoop包含两个部分:

1、HDFS

HDFS即Hadoop Distributed File System(Hadoop分布式文件系统),HDFS具有高容错性,并且可以被部署在低价的硬件设备之上。HDFS很适合那些有大数据集的应用,并且提供了对数据读写的高吞吐率。HDFS是一个master/slave的结构,就通常的部署来说,在master上只运行一个Namenode,而在每一个slave上运行一个Datanode。

HDFS支持传统的层次文件组织结构,同现有的一些文件系统在操作上很类似,比如你可以创建和删除一个文件,把一个文件从一个目录移到另一个目录,重命名等等操作。Namenode管理着整个分布式文件系统,对文件系统的操作(如建立、删除文件和文件夹)都是通过Namenode来控制。

HDFS的结构图中可以看出,Namenode,Datanode,Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候,命令不是马上就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统层次中并且在Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Client便这些本地临时文件夹中的数据块写入指定的数据节点。

HDFS采取了副本策略,其目的是为了提高系统的可靠性,可用性。HDFS的副本放置策略是三个副本,一个放在本节点上,一个放在同一机架中的另一个节点上,还有一个副本放在另一个不同的机架中的一个节点上。

2、MapReduce

有另一种分布式计算框架MPI,它在很多的问题上实现起来比Map/Reduce更方便,比如带迭代的机器学习的模型,但是个人还是要提倡Map/Reduce。原因是Map/Reduce模型中Map之间是相互独立的,因为相互独立,使得系统的可靠性大大提高了。比如一个任务需要1000个结点共同完成,在MPI中需要这1000个结点协同来完成这个任务,结点间可能有通信,数据交换。如果你有一个结点发生问题,整个任务就会失败,当然你也可能有一些容错的处理可以让任务继续算。但在海量数据情况下,比如你需要四位数的服务器运算一个任务,而你的机器是普通的服务器(commodity server),一个机器失败的概率是非常高的,这也就是Map/Reduce在处理海量数据情况下更适合的原因。在后面谈到LDA等Topic Model运算的时候,个人认为Map/Reduce不一定是最适合的,因为文档级的运算称不上是海量数据,最多是大量数据运算,它的量级是百万级左右,是否要用Map/Reduce的模型,值得探讨。但是用户级别的数据,是亿的量级,用Map/Reduce比较适合。

它是用调度计算代替调度,在处理数据时,是将程序复制到目标机器上,而不是拷贝数据到目标计算机器上。

计算流程非常类似于简单的Unix pipe,上次给出一个Unix pipe方式和Map/Reduce统计单词的功能的比较:

Pipe: cat input   | grep   |        sort    | uniq -c   > output

M/R:   Input   |  map  |  shuffle & sort  |   reduce | output

Hadoop支持多样的编程接口:

Java native map/reduce – 可以操作M/R各细节

Streaming  – 利用标准输入输出模拟以上pipeline

Pig –只关注数据逻辑,无须考虑M/R实现

这里提供一个示例,帮助您理解M/R。假设输入域是 one small step for man0, one giant leap for mankind。在这个域上运行 Map 函数将得出以下的键/值对列表:

(one,1) (small,1) (step,1) (for,1) (man,1) (one,1) (giant,1)(leap,1) (for,1) (mankind,1)

如果对这个键/值对列表应用 Reduce 函数,将得到以下一组键/值对:

(one,2) (small,1) (step,1) (for,2) (man,1)(giant,1) (leap,1)(mankind,1)

结果是对输入域中的单词进行计数。

常用统计模型

后面讨论的几种方法会用到机器学习算法,机器学习的算法有很多分类,其中有统计机器学习算法,统计机器学习在Hadoop上仅仅实现其逻辑是比较简单的。常用的统计模型可以大致归为下面两个类别:

指数族分布

大多工程上的实用分布都是指数族分布,指数族分布的形式比较简单:

它是参数和自变量的参数做内积,这个内积就是theta­­­Tu(x)。指数族分布是由最大熵的原则推导出来的,即在最大熵的假设下,满足一定条件的分布可以证明出是指数族的分布。指数族分布函数包括:Gaussian multinomial, maximum entroy。

指数族分布在工程中大量使用是因为它有一个比较好的性质,这个性质可以批核为最大似然(Maximum likelihook, ML)估计可以通过充分统计量(sufficient statistics)链接到数据(注:摘自《Pattern Recognition》),要解模型的参数,即对theta做最大似然估计,实际上可以用充分统计量来解最大似然估计:

充分估计量大小是与模型的参数的空间复杂度成正比,和数据没有关系。换言之,在你的数据上计算出充分统计量后,最就可以将数据丢弃了,只用充分统计量。比如求高斯分布的均值和方差,只需要求出样本的与样本平方和。

指数族的混合分布

它不能通过计算得到充分统计量后将数据丢弃,但它在工程中使用的更多。比如有Mixture of Gaussians,Hidden Markov Model,Probability Latent Semantic Analysis(pLSI).

虽然概率模型有很多,但个人认为解决问题的思路却很相似。即如果问题本身可以描述成一种分布,比如某种指数族分布,那么就使用该种指数族分布。比如点击率的问题,它的最值总是0或1,那么它就可以描述成Bi-nomial分布,再比如明显的钟型分布,我们可以用高斯分布。如果分布本身比较复杂,无法用单一的指数族分布描述,我们可以将多个分布叠加来描述。基本上常用的技术就这两种。

Map/Reduce统计学习流程

Map的过程是收集充分统计量,充分统计量的形式是u(x),它是指数族函数变换函数的均值。所以我们只需要得到u(x)的累加值,对高斯分布来讲,即得到样本之和,和样本平方和。Reduce即根据最大似然公式解出theta。即在在mapper中仅仅生成比较紧凑的统计量, 其大小正比于模型参数量, 与数据量无关。在图中还有一个反馈的过程,是因为是EM算法,EM是模拟指数族分布解的过程,它本质上还是用u(x)解模型中的参数,但它不是充分统计量所以它解完之后还要把参数再带回去,进行迭代。我们前面提到的所有的模型,比如高斯分布,pLSI等等都可以用这个框架去解。

大家了解了这个框架后,可以先估计一个统计模型,然后先用这个框架试一下,如果它的确是这个统计模型,那么就用这个模型解就可以了。但如果数据并不满足服从该统计模型,那么我们只能回退到使用梯度族的方法去解,梯度族的方法也很简单,因为我们往往假设样本间有独立性,我们可以在每个样本上计算梯度,累加后得到总体的梯度,Map就是在每个样本上收集梯度,在Reduce上把它们加起来,然后按梯度下降,更新模型,再进行迭代。

下面有的内容是直接从PPT中拷贝的,没有什么解释,大家可以看一下A Universal Statistical Learning Platform on Hadoop Streaming这个视频。

Map/Reduce 基本统计模型训练


Mapper

template <class TModel>

class CTrainMapper : public CFeature, public IDataNnalyzer{

protected:

TModel * pModel;

public:

/// Comsume a data record \author Peng Liu

virtual bool consume(const CRecord & record){

CFeature::consume(record);

pModel -> accumulate(*this, 1.0f);

return true;

}

/// Produced statistics (or modified data in case needed) \author Peng Liu

virtual bool produce(CRecord & record){

static bool first = true;

pModel -> produce(record);

if (record.getField("STAT") != NULL){

record.rmvField("PARAM")

return true;

}

return false;

};

}


Reducer

 

template <class TModel>

class CTrainReducer : public IDataAnalyzer{

protected:

TModel * pModel;

public:

/// Comsume a data record \author Peng Liu

virtual bool consume(const CRecord & record)

{return pModel -> consume(record);}

/// Try to update model after all input data finish \author Peng Liu

virtual void finish()

{pModel -> update();}

/// Produced model \author Peng Liu

virtual bool produce(CRecord & record){

pModel -> produce(record);

if (record.getField("STAT") != NULL){

record.rmvField("STAT");

return true;

}

return false;

}

};

示例: Gaussian模型训练

Map阶段所要计算的充分统计量为:

,Reduce阶段要计算的模型参数为:


void CGaussDiag::accumulate(CFeature & x, float occ)

{

size_t dim = getFeaDim();

assert(x.size() == dim);

accumOcc(occ);

for (size_t d = 0; d < dim; d ++)

{

    stats[      d] += occ * x[d];

    stats[dim + d] += occ * x[d] * x[d];

}

}


void CGaussDiag::update()

{

size_t dim = getFeaDim();

for (size_t d = 0; d < dim; d ++)

{

float X = stats[d],

float X2 = stats[dim + d];

    params[      d] = X / occ();

    params[dim + d] = occ() / (X2 - X * X / occ());

}

}

Hadoop上的工作流引擎-oozie

先说明一下,个人感觉oozie并不好用。

Oozie的功能是连接多个Map/Reduce Job,完成复杂的数据处理的工作流引擎,它可以很方便定制数据流之间的依赖关系,一个Job可以依赖三种条件:数据,时间,其它Job。比如它可以指定一个Job在某些数据到达后开始,可以指定固定时间Job开始运行,还可以指定在其它Job运行完成后开始。

前面说它不好用是因为它的定义很麻烦,它使用hPDL(一种XML流程语言)来定义DAG(有向无环图)工作流:

<start to=‘ingestor‘/>

<action name=‘ingestor‘> …  <ok to=“proc"/>  <error to="fail"/> </action>

<fork name=“proc">

<path start=“proc1"/>  <path start=" proc2"/> </fork>

<action name=‘proc1’> … <ok to="completed"/> <error to="fail"/> </action>

<action name=‘proc2‘>  … <ok to="completed"/> <error to="fail"/> </action>

<join name="completed" to="end"/>

<kill name="fail">  <message>Java failed, error message… </kill>

<end name=‘end‘/>

并且oozie目前不支持Iteration,因为它是DAG。如果大家要用工作流引擎,可以推荐另一个工具是Linkin开发的Azkaban,它其实和Hadoop没什么关系,它是处理Linux环境下的Job的关系,所以它非常轻量级,也有一个比较方便的图形化界面去查看。Oozie是深度的与Hadoop结合,在通过API访问上,可能是有优势的,但简单的使用上又显得太重了。

介绍工作流引擎的原因是它在广告系统中是很重要的,因为广告系统的Hadoop上运行了很多任务,比如Audience Targeting,Click Model,Forecasting(流量预测),这些任务需要一个完善的调度机制,否则在运行环境中会非常混乱,数据的失败,Job的失败很难处理。工作流引擎会使整个系统更容易控制。

时间: 2024-10-09 17:18:50

合约广告系统-Hadoop的相关文章

合约广告系统-合约广告系统

合约广告系统 直接媒体购买 合约广告英文是Agreement-based Advertising,它是一种基于合约(Agreement)的商业模式,大家会看到它与后面的Network和Exchange有相当大的不同,我们当前最主要的是把合约广告要解决的问题理解清楚,具体的技术可以再理解. 传统的广告媒体购买方式是称之为直接媒体购买方式(Direct Media Buy),它是一种简单的购买方式,比如一个杂志可能有几个广告位,比如封二页,封底页,广告主可以直接购买这些广告位,这种方式没有任何的技术

合约广告系统-常用广告系统开源工具

常用广告系统开源工具 常用广告系统开源工具 是否可以用开源工具快速地搭建广告系统?可以肯定的说,基本是可以的.很多重要的模块,如上章所讲的architecture里的模块很多都可以借助开源工具实现. 在实际的广告系统中我们会用到很多的开源工具.下面我将分别讲述几个开源开具.基本上所有的大的广告系统公司都要使用Hadoop平台,除了google.Hadoop是广告平台中建模的基础,Hadoop有很多子项目,有的子项目与Hadoop有密切的联系,有的子项目仅是在Hadoop框架体系下深挖出来的一些I

合约广告系统-在线分配问题

在线分配(Online Allocation)问题 在线分配问题 前面提到过广告是三方博弈,用户,广告主,媒体之间的博弈,而推荐系统是用户与媒体的博弈.它们之间的区别其一是广告主通媒体reach用户是有量的需求的,推荐系统是自己把内容推给用户,不见得有明显的量的需求.广告的量的需求体现在两个方面,一种是我前面提到的GD广告系统,有量的下限的需求,或者说有固定流量的需求,二是Non- Guaranteed delivery,即非合约方式,它有一种上限的限制,它受到广告预算的受限.所以在线分配问题的

广告基本知识-在线广告系统

在线广告系统 下图是广告系统的一个概念图,请大家不要误解成是实际的架构图. 搭建一个广告系统有以下几个重要组成部分: 1. 高并发的投送系统,即在线的AdServer,它通过请求中的user和context信息来决定展示哪些ads.它的特点是高并发,要做到10ms级别的实时决策,百亿次/天的广告投放系统. 2. 受众定向平台,它进行离线的数据挖掘分析,一般要用到Hadoop.比如进行点击率预测的分析. 3. 数据高速公路,它是联系在线与离线的部分,它比较简单,可以用开源工具实现,它的作用是准实时

竞价广告系统-点击率预测和逻辑回归

点击率预测和逻辑回归 点击率预测 从广告索引中我们得到很多的广告候选,这些广告从逻辑上都满足广告主的定向条件,即广告主定向条件的DNF范式,在竞价广告系统中,我们要选择一个最优的方案,最优的广告投送出来,一般最优的广告是通过eCpm进行排序,用广义第二高价进行排序,进行收费的模式.在CPC环境中eCpm=bid * ctr,那么对CTR的预测就是竞价广告系统中最重要的一个部分. 每个公司都对点击率预测有不同的做法,做法也非常多,这里只描述一下人人对这个问题的理解和看法. 广告点击预测概率模型:

竞价广告系统-流量预测

流量预测 在前面合约式广告中提到过合约式广告中有三个基本技术,1. 受众定向,2. 点击预测,3. 流量预测.在这三个技术基础上才可以做Online Allocation,本节主要介绍流量预测. 在定向条件分的比较粗的情况下,流量预测是比较简单的,比如只对人群分了几十个类,那么只需要进行简单的统计就可以进行流量预测了.但在实际的Network中,一个广告投放的定向条件比较多(即前一节中的DNF),并且条件有或的关系,也可能有与的关系. 流量预测的方法有很多,也不乏一些fancy的做法,这里只介绍

互联网DSP广告系统架构及关键技术解析

互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广告主品牌产生认同,通过长期的影响逐步形成用户对品牌的转化. 一个好的DSP系统需要满足: 拥有强大的RTB(Real-Time Bidding)的基础设

合约广告中的流量分配算法

简介 合约广告是一种基于合约的广告模式,在线广告中的一种主流方式是担保式投放(Guaranteed Delivery,GD).GD是一种量优于质的广告投放方式,需要保证广告主能够获得在合约中约定的受众用户的流量.GD中,媒体的流量按照属性划分,媒体要给不同的广告主按照合同分配约定好的流量.Ad Server的准则是希望在每一次展现满足多个合约时,选择合适的广告主,以使得每个广告主效果最好,同时能够更有效的分配流量.如下图所示,supply为媒体方,提供流量,媒体的流量可以按照性别.年龄.地域划分

广告系统的smart pricing是什么

smart pricing这个词来源于google的Adwords系统,指的是系统能够根据流量质量对流量方的收入进行打折,为的是让广告主获得更高的ROI(投资回报率).将smart pricing的使用场景抽象化,任何一个广告系统,只要它有着各种各样不同的流量,而这些流量的效果有好有坏,那么smart pricing都有它的用武之地. 如果系统发现一个流量(网站.APP.网站或APP的某个广告位)的效果好,那么,我们不对它的收入进行打折. 如果系统发现一个流量的效果差(与大盘平均效果相比),那么