如何测试 Spark RDD

2024-03-04

我不确定我们是否可以在 Spark 中测试 RDD。

我发现一篇文章说模拟 RDD 不是一个好主意。是否有其他方法或最佳实践来测试 RDD


感谢您提出这个悬而未决的问题。出于某种原因,当谈到 Spark 时,每个人都过于专注于分析,以至于忘记了过去 15 年左右出现的优秀软件工程实践。这就是为什么我们在课程中重点讨论测试和持续集成(以及 DevOps 等其他内容)。

术语简介

在继续之前,我必须对 @himanshuIIITian 引用的 KnolX 演示文稿表示一点小小的不同意见。 Atrue单元测试意味着您可以完全控制测试中的每个组件。不能与数据库、REST 调用、文件系统甚至系统时钟进行交互;正如 Gerard Mezaros 所说,一切都必须“加倍”(例如嘲笑、存根等)xUnit 测试模式 http://www.gerardmeszaros.com/。我知道这看起来像是语义学,但它确实很重要。不理解这一点是您在持续集成中看到间歇性测试失败的主要原因之一。

我们仍然可以进行单元测试

因此,鉴于这种理解,单元测试RDD是不可能的。然而,在开发分析时仍然需要进行单元测试。

(注:我将使用 Scala 作为示例,但这些概念超越了语言和框架。)

考虑一个简单的操作:

rdd.map(foo).map(bar)

Here foo and bar都是简单的函数。这些可以以正常方式进行单元测试,并且它们应该包含尽可能多的极端情况。毕竟,为什么他们关心从哪里获得输入,无论是测试装置还是测试装置?RDD?

不要忘记 Spark Shell

这不是测试per se,但在这些早期阶段,您还应该在 Spark shell 中进行试验,以找出您的转换,尤其是您的方法的结果。例如,您可以使用许多不同的功能来检查物理和逻辑查询计划、分区策略和保存以及数据的状态,例如toDebugString, explain, glom, show, printSchema, 等等。我会让你探索这些。

您还可以将您的主人设置为local[2]在 Spark shell 和测试中识别仅在开始分发工作后可能出现的任何问题。

Spark 集成测试

现在来说说有趣的事情。

为了集成测试当您对辅助功能的质量充满信心并且RDD/DataFrame转换逻辑,做一些事情很关键(无论构建工具和测试框架如何):

  • 增加 JVM 内存。
  • 启用分叉但禁用并行执行。
  • 使用您的测试框架将 Spark 集成测试累积到套件中,并初始化SparkContext在所有测试之前并在所有测试之后停止它。

有多种方法可以完成最后一项。可以从火花测试基地 https://github.com/holdenk/spark-testing-base@Pushkr 和 @himanshuIIITian 链接的 KnolX 演示文稿都引用了。

贷款模式

另一种方法是使用贷款模式 https://stackoverflow.com/questions/20762240/loaner-pattern-in-scala.

例如(使用 ScalaTest):

class MySpec extends WordSpec with Matchers with SparkContextSetup {
  "My analytics" should {
    "calculate the right thing" in withSparkContext { (sparkContext) =>
      val data = Seq(...)
      val rdd = sparkContext.parallelize(data)
      val total = rdd.map(...).filter(...).map(...).reduce(_ + _)

      total shouldBe 1000
    }
  }
}

trait SparkContextSetup {
  def withSparkContext(testMethod: (SparkContext) => Any) {
    val conf = new SparkConf()
      .setMaster("local")
      .setAppName("Spark test")
    val sparkContext = new SparkContext(conf)
    try {
      testMethod(sparkContext)
    }
    finally sparkContext.stop()
  }
} 

正如您所看到的,贷款模式利用高阶函数来“贷款”SparkContext进行测试,然后在完成后进行处理。

面向痛苦的编程(谢谢,Nathan)

这完全是一个偏好问题,但我更喜欢使用贷款模式,并在引入另一个框架之前尽可能长时间地自行连接。除了试图保持轻量级之外,框架有时还会添加很多“魔力”,使调试测试失败变得难以推理。所以我采取面向痛苦的编程 http://nathanmarz.com/blog/suffering-oriented-programming.html方法——我避免添加新框架,直到无法承受没有它的痛苦。但同样,这取决于你。

现在有一个地方火花测试基地真正令人眼前一亮的是基于 Hadoop 的助手,例如HDFSClusterLike and YARNClusterLike。将这些特征混合在一起确实可以为您省去很多设置的麻烦。它的另一个闪光点是斯卡拉检查 https://www.scalacheck.org/-类似属性和生成器。但同样,我个人会推迟使用它,直到我的分析和测试达到这种复杂程度。

与 Spark Streaming 的集成测试

最后,我想展示一个带有内存值的 Spark Streaming 集成测试设置的片段:

val sparkContext: SparkContext = ...
val data: Seq[(String, String)] = Seq(("a", "1"), ("b", "2"), ("c", "3"))
val rdd: RDD[(String, String)] = sparkContext.parallelize(data)
val strings: mutable.Queue[RDD[(String, String)]] = mutable.Queue.empty[RDD[(String, String)]]
val streamingContext = new StreamingContext(sparkContext, Seconds(1))
val dStream: InputDStream = streamingContext.queueStream(strings)
strings += rdd

这比看起来更简单。它实际上只是将一系列数据转换成一个队列以提供给DStream。其中大部分实际上只是与 Spark API 配合使用的样板设置。

这可能是我有史以来最长的帖子,所以我将其留在这里。我希望其他人提出其他想法,通过与改进所有其他应用程序开发相同的敏捷软件工程实践来帮助提高我们的分析质量。

对无耻的插件表示歉意,您可以查看我们的课程使用 Apache Spark 进行分析 http://www.vidyasource.com/course/Scala/Java/Python/Programming/Data/Hadoop/Analytics/Testing/Architecture/Projects/Agile/2015/08/15/analytics-with-apache-spark,我们在这里讨论了很多这样的想法以及更多。我们希望尽快推出在线版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试 Spark RDD 的相关文章

随机推荐

  • 如何使Java应用程序独立?

    我必须将 Java 应用程序刻录到 CD 上 此应用程序必须在之前未进行任何安装的情况下在每台 Windows PC 上运行 也不应安装 JRE 我想您也可以将 JRE 从程序文件夹复制到 CD 上 然后 添加批处理脚本以使用 本地 JRE
  • 词法或预处理器问题:找不到“MyViewController.h”文件

    当我尝试更改视图控制器名称时 h and m 我收到此错误 Lexical or PreProcessor Issue MyViewController h file not found 仅供参考 尽管存在词法错误 但应用程序仍可以正确运行
  • Spring 3.1实例化bean时出错

    我有以下课程 public abstract class AbstractBusinessModule public class MS3BusinessModule extends AbstractBusinessModule public
  • 在 Woocommerce 中添加运送区域的州而不是邮政编码

    我有一个 woocommerce 网站 默认情况下 在 woocommerce 中 我可以通过邮政编码限制运输区域 但是 如何在送货区域中添加我所在国家 地区的州 以便客户可以通过结账页面中的 下拉菜单 选择他们居住的州 而不是输入邮政编码
  • Heroku 给出 500 错误,信息很少 + 内部服务器错误

    Heroku 在页面上显示此消息 internal server error 此错误显示在控制台中 GET 500内部服务器错误 检查 Heroku 应用程序的日志以查看更多详细信息 您可以使用流式传输日志Heroku CLI https
  • 远程 logcat - Android Studio

    是否可以看到远程设备上的应用程序的logcat 简而言之 是否可以远程logcat 我向客户端发送了一个应用程序 这在您的设备中给出了错误 我使用同一版本的模拟器进行了测试 但仅发生了该错误 是否可以查看远程应用程序的 logcat 设备
  • Brushes.White 减慢了图形演示速度

    下面是 Conway 的生命游戏在 WPF 中的 非常幼稚的 实现 这只是一个演示 xaml
  • 这种方法名称/局部变量混合会发生什么?

    我在一些代码中发现了一个执行以下操作的方法 def method1 method1 1 2 2 3 4 5 5 return method1 uniq end ruby 如何处理这个问题 我知道这是错误的代码 但是 ruby 如何知道如何处
  • 从文件加载公钥数据

    在我的应用程序中 我生成一个公钥 私钥对并将它们存储在磁盘上以供以后使用 加载并重新初始化私钥工作正常 但对于私钥 我得到一个未知的 KeySpec 类型 java security spec PKCS8EncodedKeySpec 我不知
  • Jquery / Javascript - 添加迄今为止的年份变量

    我有一个小麻烦 如果能得到一些帮助就太好了 我正在创建一个小表单 我想将当前日期格式化 dd mm yyyy 并从下拉框中添加年份变量以创建最终到期日期 唯一的麻烦是我不知道如何将开始日期解析为日期变量以完成计算 任何想法或帮助将不胜感激
  • 在 Delphi 中读取/解析非类型二进制文件的最佳方法

    我想知道解析非类型二进制文件的最佳方法是什么 例如 EBML 文件 http ebml sourceforge net EBML 基本上是一个二进制 xml 文件 它基本上可以存储任何内容 但目前它的主要用途是 MKV 视频文件 matro
  • 从数据库sqlite获取信息

    如何从数据库中获取信息 我想执行这一行 String nom db execSQL select name from person where id id 任何人都可以纠正我这一行以从表中获取人名吗 如果您的 id 是整数数据类型 请尝试此
  • 检测设备是否支持通话?

    下面的代码可以可靠地用来确定设备是否支持通话吗 我担心的是 如果苹果将 iphone 字符串更改为其他内容 假设他们决定拥有 iphone 3g iphone 4 等 UIDevice currentDevice model isEqual
  • Xamarin.forms 在 web 视图中显示 PDF 不起作用

    我从我的服务器下载 pdf 流 在我的应用程序中 我将 bytearray 作为 pdf 保存到本地文件夹中 但是当我在网络视图中打开它时 它只显示一个白色页面 我按照这个例子 https developer xamarin com rec
  • java.lang.illegalstateException数据库未打开android

    当我尝试插入数据库日志时 猫显示如下错误java lang illegalstateexception database not open android 但我已经使用打开数据库 db SQLiteDatabase openDatabase
  • Rails Admin 与 Active Admin:Rails Admin 生成工具[重复]

    这个问题在这里已经有答案了 可能的重复 Rails Admin 与 ActiveAdmin https stackoverflow com questions 6542075 rails admin vs activeadmin 我知道已经
  • Laravel:路由中间件和策略之间的区别

    使用 Laravel 开发应用程序我意识到可以做什么Policy完全可以用Middleware 假设我想阻止用户更新路线 如果他 她不是信息的所有者 我可以轻松地从路线中进行检查 并且可以从策略中执行相同的操作 所以我的问题是为什么我应该使
  • 我如何使用 Passport-local.js 存储其他表单字段

    我正在研究 node passport js 身份验证 我制作了一个简单的登录 注册应用程序 它工作正常 但是它只存储用户名和密码 如何通过具有工作登录护照身份验证的 Signup html 页面将其他表单字段 例如电话号码 电子邮件 爱好
  • 检查后台限制数据是否开启?

    我有一个在主线程上运行而不是在后台运行的服务 在服务中 我正在通过广播接收器检查网络连接 当我启用限制数据已启用在 设置 中 广播接收器可以很好地捕捉意图 但我的应用程序已禁用互联网连接 移动数据 尽管它在我的设备上 我见过这个问题 htt
  • 如何测试 Spark RDD

    我不确定我们是否可以在 Spark 中测试 RDD 我发现一篇文章说模拟 RDD 不是一个好主意 是否有其他方法或最佳实践来测试 RDD 感谢您提出这个悬而未决的问题 出于某种原因 当谈到 Spark 时 每个人都过于专注于分析 以至于忘记