在 eBay,我们希望我们的客户获得尽可能最好的体验。我们使用数据分析来改善用户体验、提供相关优惠、优化性能并创造许多其他类型的价值。 eBay 支持此 va 的一种方式
在 eBay,我们希望我们的客户获得尽可能最好的体验。我们使用数据分析来改善用户体验、提供相关优惠、优化性能并创造许多其他类型的价值。 eBay 支持这种价值创造的一种方式是利用支持、加速或简化数据分析的数据处理框架。 Apache Spark 就是这样的框架之一。这篇文章介绍了 Apache Spark 如何融入 eBay 的分析数据基础设施。
Apache Spark 网站?将 Spark 描述为“用于大规模数据处理的快速通用引擎”。 Spark 是一个支持并行、分布式数据处理的框架。它提供了一个简单的编程抽象,提供了强大的缓存和持久性功能。 Spark 框架可以通过 Apache Mesos、通过 Yarn 的 Apache Hadoop 或 Spark 自己的集群管理器进行部署。开发人员可以通过多种编程语言(包括 Java、Scala 和 Python)使用 Spark 框架。 Spark 还可以作为其他数据处理框架的基础,例如 Shark,它为 Hadoop 提供 SQL 功能。
Spark 是用于迭代处理大型数据集的优秀工具。 Spark 适合此类处理的一种方式是通过其弹性分布式数据集 (RDD)。在题为“弹性分布式数据集:内存集群计算的容错抽象”的论文中,RDD 被描述为“……容错的并行数据结构,让用户可以将中间结果显式地保存在内存中,控制其分区以优化数据放置” ,并使用一组丰富的运算符来操纵它们。”通过使用 RDD,程序员可以将大型数据集固定到内存中,从而支持高性能的迭代处理。与每次处理迭代从磁盘读取大型数据集相比,内存解决方案显然要快得多。
下图显示了一个简单的示例,使用 Spark 从 HDFS 读取输入数据,使用 RDD 对该数据执行一系列迭代操作,并将后续输出写回 HDFS。
在第一次映射到 RDD(1) 的情况下,并非所有数据都能容纳在 RDD 允许的内存空间内。在这种情况下,程序员能够指定如何处理不适合的数据。这些选项包括将计算的数据溢出到磁盘并在读取时重新创建它。我们可以在这个示例中看到每个处理迭代如何利用内存来读取和写入其数据。这种利用内存的方法可能比其他纯粹依赖磁盘存储来获得间歇性结果的方法快 100 倍。
如今,Spark 在 eBay 上最常通过 Hadoop 和 Yarn 来使用。 Yarn 管理 Hadoop 集群的资源,并通过使用 Yarn 容器运行通用任务,使 Hadoop 能够超越传统的 Map 和 Reduce 作业。通过 Hadoop Yarn 框架,eBay 的 Spark 用户能够利用接近 2000 个节点、100TB RAM 和 20,000 个核心的集群。
以下示例通过 Yarn 演示了 Hadoop 上的 Spark。
用户将 Spark 作业提交到 Hadoop。 Spark 应用程序主机在单个 Yarn 容器中启动,然后开始与 Yarn 资源管理器一起生成 Spark 执行器 - 根据用户请求的数量。这些 Spark 执行器将使用指定的内存量和 CPU 核心数来运行 Spark 应用程序。在这种情况下,Spark 应用程序能够读取和写入驻留在 HDFS 中的集群数据。这种在 Hadoop 上运行 Spark 的模型说明了 Hadoop 不断增强的能力,即为共享数据上的数据处理提供单一的基础平台。
eBay 分析师社区包括强大的 Scala 用户队伍。因此,许多 eBay 的 Spark 用户都在用 Scala 编写工作。这些工作通过查询复杂数据、数据建模和数据评分等用例来支持发现。下面是 Spark Scala 应用程序的代码片段。该应用程序使用 Spark 的机器学习库 MLlib,通过 KMeans 对 eBay 的卖家进行集群。卖家属性数据存储在HDFS中。
/** * read input files and turn into usable records */ var table = new SellerMetric() val model_data = sc.sequenceFile[Text,Text]( input_path ,classOf[Text] ,classOf[Text] ,num_tasks.toInt ).map( v => parseRecord(v._2,table) ).filter( v => v != null ).cache .... /** * build training data set from sample and summary data */ val train_data = sample_data.map( v => Array.tabulate[Double](field_cnt)( i => zscore(v._2(i),sample_mean(i),sample_stddev(i)) ) ).cache /** * train the model */ val model = KMeans.train(train_data,CLUSTERS,ITERATIONS) /** * score the data */ val results = grouped_model_data.map( v => ( v._1 ,model.predict( Array.tabulate[Double](field_cnt)( i => zscore(v._2(i),sample_mean(i),sample_stddev(i)) ) ) ) ) results.saveAsTextFile(output_path) |
除了 Spark Scala 用户之外,eBay 的一些人也开始使用 Spark 和 Shark 来加速他们的 Hadoop SQL 性能。许多 Shark 查询的运行速度比 Hive 查询快 5 倍。虽然 eBay 的 Spark 仍处于早期阶段,但随着 eBay 的 Spark 用户数量不断增加,其使用量正在从实验性扩展到日常使用。
Spark 正在帮助 eBay 从其数据中创造价值,因此 Spark 在 eBay 的未来是光明的。我们的 Hadoop 平台团队已开始准备正式支持 Hadoop 上的 Spark。此外,我们还密切关注 Hadoop 如何继续发展对 Spark 等框架的支持、社区如何使用 Spark 从数据中创造价值,以及 Hortonworks 和 Cloudera 等公司如何将 Spark 纳入其产品组合。 eBay 内的一些团队正在考虑在 Hadoop 之外构建自己的 Spark 集群。这些集群要么利用更专业的硬件,要么是特定于应用程序的。其他人正在致力于将 eBay 已经强大的数据平台语言扩展合并到 Spark 模型中,以便更轻松地在 Spark 中利用 eBay 的数据。与此同时,我们将继续看到 eBay 上 Spark 的采用率不断增加。这种采用将由大厅中的聊天、时事通讯简介、产品公告、行业讨论以及 Spark 自身的优势和能力来推动。
原文地址:使用 Spark 点燃数据分析,感谢原作者分享。