使用 Kafka 在 Spark Streaming 上对应用程序 运行 进行功能测试

Functional tests of application running on Spark Streaming with Kafka

我正在为应用程序设置功能测试 运行 Spark Streaming 和 Kafka。要完成的步骤是

  1. 启动动物园管理员服务器
  2. 启动kafka服务器
  3. 启动消息生成器以向 kafka 提供必要的数据
  4. 启动 Spark Streaming 应用程序
  5. 等待 5 分钟
  6. 停止消息生产者
  7. 停止 Spark Streaming 应用程序
  8. 停止kafka服务器
  9. 停止动物园管理员服务器
  10. 验证输出

除了简单的 bash 脚本之外,还有什么专业的方法可以做到这一点?

我认为这是一个非常笼统的问题,与 Spark Streaming 和 Kafka 没有严格关系。可能有一些测试框架支持搭建环境,运行多进程并行和数据validation/assertions.

Maybe there are some testing frameworks which support setting up the environment, running multiple processes in parallel and data validation/assertions.

不幸的是,目前还没有一体化的框架。

单行答案是:使用 docker-compose 与您选择的最简单的单元测试或基于小黄瓜的框架

将上述步骤视为:

  1. 启动环境

  2. 生成 Kafka 消息/验证

  3. 关闭环境

Docker-Compose 将是步骤 #1 和 #3 的最佳选择。

version: '2'
services:
  kafka:
    # this container already has zookeeper built in
    image: spotify/kafka
    ports:
      - 2181:2181
      - 9092:9092   
  # its just some mock-spark container, you'll have to replace it with 
  # docker container that can host your spark-app
  spark: 
    image: epahomov/docker-spark:lightweighted
    depends_on:
      - kafka 

撰写文件的想法是您可以使用一个命令启动您的环境:

docker-compose up

而且环境设置几乎可以跨开发机器和构建服务器移植。

对于第 2 步,任何测试框架都可以。

场景如下:

  • 启动环境/确保它已启动
  • 开始生成消息
  • 做出断言/让我的甜蜜线程休眠
  • 关闭环境

谈论框架:

  • Scala:Scalatest。在那里你可以有很好的异步断言和并行处理范围。

  • Python: Behave (be careful with multiprocessing there) or unit-testing framework such as pytest

不要让命名 "unit-testing framework" 让您感到困惑。 只有测试环境定义测试是否成为单元、模块化、系统或集成类,而不是工具。

如果一个人使用单元测试框架并在那里写 MyZookeeperConnect("192.168.99.100:2181")它不再是单元测试了,连单元测试框架都帮不了它:)

将步骤 #1、#2、#3 粘合在一起 - 简单 bash 是我的选择。

考虑使用 Citrus (http://citrusframework.org/) 测试框架,它可能是适合您的一体化测试框架。

  • Zookeeper 访问权限:检查
  • Docker 集成:检查
  • 通过 Apache Camel 集成 Kafka:检查
  • 等待x时间:检查
  • 验证结果:检查

还考虑使用 Fabric8 Docker Maven 插件 (https://github.com/fabric8io/docker-maven-plugin) 来设置 Docker 测试环境,然后在同一构建 运行 中执行 Citrus 测试。

下面是两个工具协同工作以进行自动化集成测试的示例:https://github.com/christophd/citrus-samples/tree/master/sample-docker