文章来自于:http://www.infoq.com/cn/news/2014/04/spark-streaming-bidding

来自于Sharethrough的数据基础设施工程师Russell Cardullo和Michael Ruggiero最近在Cloudera博客上投递了一篇博文,分享了他们是如何使用Spark Streaming解决复杂的实时问题的。下面是博文的具体内容,如果您想查看英文原文,可以点击这里

Sharethrough是一家从事视频广告业务的初创公司,在过去的三年中(从Amazon EMR上迁移出来之后)我们一直运行在CDH上面,主要是为了ETL。随着2013年早期交易平台的启动以及对优化实时内容分发的需要,我们需要做出一些改变,但是CDH依然是我们基础设施中的一个重要部分。

在2013年年中,我们开始尝试使用基于流的方式访问管道中的点击流数据。我们问自己:我们是否能够给自己的开发人员一个针对增量、小批处理任务做过优化的编程模型和框架并继续依赖于Cloudera平台,而不是通过更频繁地运行那些更大的批处理任务“加热我们的冷路径”?在理想的情况下,我们的工程师团队关注于数据本身,而不是担心具体细节,例如管道间的状态一致性或者故障恢复。

Spark(和Spark Streaming)

Apache Spark是一个快速通用的大数据处理框架,它的编程模型比较适合于构建那些对常规的MapReduce而言太过于复杂或者不太可行的应用程序。Cloudera Enterprise 5已经包含了Spark,并且已经支持CDH 4.4及更新版本。借助于对内存持久化存储的抽象,Spark支持所有的MapReduce功能,但是它执行地更快,因为它不需要进行数据复制、磁盘I/O和序列化。

因为Spark Streaming与Spark批处理和交互模式共享同样的API,所以我们现在可以使用Spark Streaming实时聚合关键的业务数据。一致的API意味着我们能够使用较为简单的批处理模式进行本地的开发和测试,同时又能让这些工作无缝地在产品环境中运行。例如,我们现在可以使用与某个活动相关的所有数据集优化实时竞价,不需要等运行频率较低的ETL流完成。此外,我们还能执行实时实验并衡量结果。

使用Spark之前和之后

之前,我们的批处理系统是这样的:

  1. Apache Flume基于最优的HDFS块大小(64MB)将文件写入到每小时的桶中
  2. 每天定时执行MapReduce (Scalding) 任务N次
  3. Apache Sqoop将结果移入数据仓库
  4. 延迟是~1小时之后,加上Hadoop的处理时间

Sharethrough之前的批处理数据流

对我们这个特定用例,尽管那些运算结果依然是有价值的,但是这个批处理流程却无法让我们实时访问绩效数据。例如,一个小时之后我们才能知道用户每天的预算是否花完,这意味着我们的广告商要花一些冤枉钱,我们的内容商无法填满自己的需求。即使是在批处理任务只会花费几分钟的时候,流量峰值也可能会减慢给定的批处理任务,导致它“撞”到新启动的任务。

对于这些用例,流式数据处理是可行的解决方案。

  1. Flume将点击流数据写入HDFS
  2. Spark每5秒钟从HDFS上读取数据
  3. 输出到一个键—值存储并更新预测模型

Sharethrough新的基于Spark Streaming的数据流

在新模型中,我们的延迟时间仅仅是Spark的处理时间和Flume将文件传输到HDFS上的时间;在实际情况下,这个工作大约会花费5秒钟。

在路上

在开始使用Spark Streaming的时候,我们开始的非常快,遇到的麻烦很少。为了更好地利用新的Streaming任务,我们很快就调整成了Spark编程模型。

下面是我们在这个过程中发现的一些事情:

  • 24 x 7流式应用的结构和按小时的批处理任务是不同的——你可能需要细粒度的警报,并对重复的错误更有耐心。对于流式应用你需要良好的异常处理。准备好回答这样的问题:“如果Spark接收端不可用怎么办?应用程序是否应该重试?是否应该忽略丢失的数据?是否应该给你报警?”
  • 花时间验证输入对应的输出。例如,验证一个记录点击数的任务在测试时是否会返回符合你期望的结果。
  • 确认支持的对象被序列化。Scala DSL让我们能够容易地封装非可序列化的变量或者引用。在我们的场景中,GeoCoder对象并没有被序列化,导致我们的应用运行的非常慢;它必须返回到原来的驱动程序,非分布式对象。
  • Spark Streaming任务的输出仅和喂养Spark的队列一样可靠。如果生产队列落下了1%的消息,那么你可能需要一个定期调整策略,例如将有损耗的“热路径”和“冷路径”持久数据进行合并。对于这种类型的合并,当你确实需要精确可靠的关联计算时(例如计数)monoid抽象可能是有帮助的。如果你想了解更多与此相关的信息,可以查看可合并的存储,例如Twitter的Storehaus或者Oscar Boykin的Algebra for Analytics

结论

Sharethrough的工程师打算使用Spark Streaming做更多的事情。我们的工程师可以交互式地制作一个应用程序,测试它的批处理,然后将它转移到Streaming上并让它正常运行。我们鼓励其他对实时处理感兴趣的人看看Spark Streaming。由于简洁的Spark API,熟悉MapReduce的工程师现在不需要学习全新的编程模型就能构建Streaming应用程序。

Spark Streaming让你的组织能够攫取那些只能从分钟级的数据中获取的价值,或者以机器学习算法的形式,或者是实时仪表盘:完全取决于你!

转:Sharethrough使用Spark Streaming优化实时竞价的更多相关文章

  1. 使用 Kafka 和 Spark Streaming 构建实时数据处理系统

    使用 Kafka 和 Spark Streaming 构建实时数据处理系统 来源:https://www.ibm.com/developerworks,这篇文章转载自微信里文章,正好解决了我项目中的技 ...

  2. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

  3. 使用 Kafka 和 Spark Streaming 构建实时数据处理系统(转)

    原文链接:http://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice2/index.html?ca=drs-&ut ...

  4. demo2 Kafka+Spark Streaming+Redis实时计算整合实践 foreachRDD输出到redis

    基于Spark通用计算平台,可以很好地扩展各种计算类型的应用,尤其是Spark提供了内建的计算库支持,像Spark Streaming.Spark SQL.MLlib.GraphX,这些内建库都提供了 ...

  5. 某人视频中提到的 Spark Streaming 优化的几点事项

    某人,并未提他的名字,是因为看的视频是1年前的,视频里他吹得厉害.我看视频时,查了一下他在视频里说的要做到的东西,结果上网一查,就看到了很多人说他骗了钱后,就不管交了学费的人了.真假无从查起.但是无风 ...

  6. zeppelin中运行spark streaming kakfa & 实时可视化

    notebook方式运行spark程序是一种比较agile的方式,一方面可以体验像spark-shell那样repl的便捷,同时可以借助notebook的作图能力实现快速数据可视化,非常方便快速验证和 ...

  7. Spark 实践——基于 Spark Streaming 的实时日志分析系统

    本文基于<Spark 最佳实践>第6章 Spark 流式计算. 我们知道网站用户访问流量是不间断的,基于网站的访问日志,即 Web log 分析是典型的流式实时计算应用场景.比如百度统计, ...

  8. 基于Kafka+Spark Streaming+HBase实时点击流案例

    背景 Kafka实时记录从数据采集工具Flume或业务系统实时接口收集数据,并作为消息缓冲组件为上游实时计算框架提供可靠数据支撑,Spark 1.3版本后支持两种整合Kafka机制(Receiver- ...

  9. Spark Streaming的实时词频和累加词频统计

    (注:运行环境是Ubuntu16, pycharm) 1. 按时段统计:获取scoket端口传输的数据(英文数据即可,方便分词),统计各个时间段内每个单词出现的次数(每个时间段都分别统计,需要使用的关 ...

随机推荐

  1. jSP的3种方式实现radio ,checkBox,select的默认选择值。

    jSP的3种方式实现radio ,checkBox,select的默认选择值.以radiao 为例:第一种方式:在jsp中使用java 脚本,这个方法最直接,不过脚本太多,不容易维护<%Stri ...

  2. 启动tomcat时报classpath not found

    启动tomcat时报classpath  not found 原因是缺包,首先查看tomcat安装地址,然后找到webapps目录下,找到该项目,看lib下是否缺包,不能单纯的看项目下是否缺包.

  3. angularJS $watch $digest $apply

    一 简介AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式.数据绑定意味着当View中有任何数据发生了变化,那么 ...

  4. bzoj3669: [Noi2014]魔法森林 lct

    记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...

  5. quartz 定时任务的实现

    需求:项目中有一个任务,当时间到了会向移动端通过百度云推送推送信息,之前很傻叉的是写一个多线程一直扫描,每分钟扫描一次,比对当前时间和任务时间是否一样,结果把 项目跑死了,项目中用了一个简单的quar ...

  6. SpringMVC 学习笔记(一) Hello World

    springMVC概述: Spring MVC 是眼下最主流的MVC 框架之中的一个 Spring MVC 通过一套 MVC 注解.让 POJO 成为处理请 求的控制器,而无须实现不论什么接口. 支持 ...

  7. android ContentProvider学习

    1.ContentProvider提供位存储或获取数据提供了统一的接口. 2.使用ContentProvider可以在不同的应用程序之间共享数据. 3.Android为常见的一些数据提供了Conten ...

  8. Android 模仿微信启动动画(转)

    本文内容 环境 项目结构 演示微信启动动画 本文演示微信启动动画.请点击此处下载,自行调试. 顺便抱怨一下,实践性(与研究性质的相对)技术博的“七宗罪”: 第一宗罪,错字连篇,逻辑不清: 第二宗罪,文 ...

  9. servlet 配置到服务器

    最近写了个安卓项目,服务端用的servlet.因为第一次写java项目,写完如何发布不是太清除,于是把这回经理写出来,一来做个记录,二来也给和我同样经历的朋友一点启示. 首先配置你的java主机和你的 ...

  10. DataSet离线数据集实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...