测试工具

测试是开发分布式系统中最重要的部分,我们提供了以下类型的测试。

本页面给出了 Ozone 自带的测试工具。

注意:我们还进行了其它测试(比如通过 Spark 或 Hive 进行的 TCP-DS、TCP-H),但因为它们是外部工具,所以没有在此列出。

单元测试

和每个 java 项目一样,我们的每个项目都包含传统的单元测试。

集成测试(JUnit)

传统的单元测试只能测试一个单元,但我们也有更高层次的单元测试。它们使用 MiniOzoneCluster 辅助方法在单元测试中启动守护进程(SCM、OM、数据节点)。

从 maven 或 java 的角度来看,集成测试也只是普通的单元测试而已(使用了 JUnit 库),但为了解决一些依赖问题,我们将它们单独放在了 hadoop-ozone/integration-test 目录下。

冒烟测试

我们使用基于 docker-compose 的伪集群来运行不同配置的 Ozone,为了确保这些配置可用,我们在 https://robotframework.org/ 的帮助下实现了 验收 测试。

冒烟测试包含在发行包中(./smoketest),但 robot 文件只定义了运行命令行然后检查输出的测试。

为了在不同环境(docker-compose、kubernetes)下运行冒烟测试,你需要定义如何启动容器,然后在正确的容器中执行正确的测试。

这部分的测试包含在 compose 目录中(查看 ./compose/*/test.sh 或者 ./compose/test-all.sh)。

例如,一种测试分发包的简单方法是:

  1. cd compose/ozone
  2. ./test.sh

Blockade

Blockade 是一个测试网络故障和分片的工具(灵感来自于大名鼎鼎的Jepsen 测试)。

Blockade 测试在其它测试的基础上实现,可以在分发包中的 ./blockade 目录下进行测试。

  1. cd blocakde
  2. pip install pytest==2.8.7,blockade
  3. python -m pytest -s .

更多细节查看 blockade 目录下的 README。

MiniChaosOzoneCluster

这是一种在你的机器上获得混沌的方法。它可以直接从源码启动一个 MiniOzoneCluster (会启动真实的守护进程),并随机杀死它。

Freon

Freon 是 Ozone 发行包中包含的命令行应用,它是一个负载生成器,用于压力测试。

例如:

  1. ozone freon randomkeys --numOfVolumes=10 --numOfBuckets 10 --numOfKeys 10 --replicationType=RATIS --factor=THREE
  1. ***************************************************
  2. Status: Success
  3. Git Base Revision: 48aae081e5afacbb3240657556b26c29e61830c3
  4. Number of Volumes created: 10
  5. Number of Buckets created: 100
  6. Number of Keys added: 1000
  7. Ratis replication factor: THREE
  8. Ratis replication type: RATIS
  9. Average Time spent in volume creation: 00:00:00,035
  10. Average Time spent in bucket creation: 00:00:00,319
  11. Average Time spent in key creation: 00:00:03,659
  12. Average Time spent in key write: 00:00:10,894
  13. Total bytes written: 10240000
  14. Total Execution time: 00:00:16,898
  15. ***********************

更多细节请查看 freon 文档页面

Genesis

Genesis 是一个微型的基准测试工具,它也包含在发行包中(ozone genesis),但是它不需要一个真实的集群,而是采用一种隔离的方法测试不同部分的代码(比如,将数据存储到本地基于 RocksDB 的键值存储中)。

运行示例:

  1. ozone genesis -benchmark=BenchMarkRocksDbStore
  2. # JMH version: 1.19
  3. # VM version: JDK 11.0.1, VM 11.0.1+13-LTS
  4. # VM invoker: /usr/lib/jvm/java-11-openjdk-11.0.1.13-3.el7_6.x86_64/bin/java
  5. # VM options: -Dproc_genesis -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/var/log/hadoop -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,console -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender
  6. # Warmup: 2 iterations, 1 s each
  7. # Measurement: 20 iterations, 1 s each
  8. # Timeout: 10 min per iteration
  9. # Threads: 4 threads, will synchronize iterations
  10. # Benchmark mode: Throughput, ops/time
  11. # Benchmark: org.apache.hadoop.ozone.genesis.BenchMarkRocksDbStore.test
  12. # Parameters: (backgroundThreads = 4, blockSize = 8, maxBackgroundFlushes = 4, maxBytesForLevelBase = 512, maxOpenFiles = 5000, maxWriteBufferNumber = 16, writeBufferSize = 64)
  13. # Run progress: 0.00% complete, ETA 00:00:22
  14. # Fork: 1 of 1
  15. # Warmup Iteration 1: 213775.360 ops/s
  16. # Warmup Iteration 2: 32041.633 ops/s
  17. Iteration 1: 196342.348 ops/s
  18. ?stack: <delayed till summary>
  19. Iteration 2: 41926.816 ops/s
  20. ?stack: <delayed till summary>
  21. Iteration 3: 210433.231 ops/s
  22. ?stack: <delayed till summary>
  23. Iteration 4: 46941.951 ops/s
  24. ?stack: <delayed till summary>
  25. Iteration 5: 212825.884 ops/s
  26. ?stack: <delayed till summary>
  27. Iteration 6: 145914.351 ops/s
  28. ?stack: <delayed till summary>
  29. Iteration 7: 141838.469 ops/s
  30. ?stack: <delayed till summary>
  31. Iteration 8: 205334.438 ops/s
  32. ?stack: <delayed till summary>
  33. Iteration 9: 163709.519 ops/s
  34. ?stack: <delayed till summary>
  35. Iteration 10: 162494.608 ops/s
  36. ?stack: <delayed till summary>
  37. Iteration 11: 199155.793 ops/s
  38. ?stack: <delayed till summary>
  39. Iteration 12: 209679.298 ops/s
  40. ?stack: <delayed till summary>
  41. Iteration 13: 193787.574 ops/s
  42. ?stack: <delayed till summary>
  43. Iteration 14: 127004.147 ops/s
  44. ?stack: <delayed till summary>
  45. Iteration 15: 145511.080 ops/s
  46. ?stack: <delayed till summary>
  47. Iteration 16: 223433.864 ops/s
  48. ?stack: <delayed till summary>
  49. Iteration 17: 169752.665 ops/s
  50. ?stack: <delayed till summary>
  51. Iteration 18: 165217.191 ops/s
  52. ?stack: <delayed till summary>
  53. Iteration 19: 191038.476 ops/s
  54. ?stack: <delayed till summary>
  55. Iteration 20: 196335.579 ops/s
  56. ?stack: <delayed till summary>
  57. Result "org.apache.hadoop.ozone.genesis.BenchMarkRocksDbStore.test":
  58. 167433.864 ?(99.9%) 43530.883 ops/s [Average]
  59. (min, avg, max) = (41926.816, 167433.864, 223433.864), stdev = 50130.230
  60. CI (99.9%): [123902.981, 210964.748] (assumes normal distribution)
  61. Secondary result "org.apache.hadoop.ozone.genesis.BenchMarkRocksDbStore.test:?stack":
  62. Stack profiler:
  63. ....[Thread state distributions]....................................................................
  64. 78.9% RUNNABLE
  65. 20.0% TIMED_WAITING
  66. 1.1% WAITING
  67. ....[Thread state: RUNNABLE]........................................................................
  68. 59.8% 75.8% org.rocksdb.RocksDB.put
  69. 16.5% 20.9% org.rocksdb.RocksDB.get
  70. 0.7% 0.9% java.io.UnixFileSystem.delete0
  71. 0.7% 0.9% org.rocksdb.RocksDB.disposeInternal
  72. 0.3% 0.4% java.lang.Long.formatUnsignedLong0
  73. 0.1% 0.2% org.apache.hadoop.ozone.genesis.BenchMarkRocksDbStore.test
  74. 0.1% 0.1% java.lang.Long.toUnsignedString0
  75. 0.1% 0.1% org.apache.hadoop.ozone.genesis.generated.BenchMarkRocksDbStore_test_jmhTest.test_thrpt_jmhStub
  76. 0.0% 0.1% java.lang.Object.clone
  77. 0.0% 0.0% java.lang.Thread.currentThread
  78. 0.4% 0.5% <other>
  79. ....[Thread state: TIMED_WAITING]...................................................................
  80. 20.0% 100.0% java.lang.Object.wait
  81. ....[Thread state: WAITING].........................................................................
  82. 1.1% 100.0% jdk.internal.misc.Unsafe.park
  83. # Run complete. Total time: 00:00:38
  84. Benchmark (backgroundThreads) (blockSize) (maxBackgroundFlushes) (maxBytesForLevelBase) (maxOpenFiles) (maxWriteBufferNumber) (writeBufferSize) Mode Cnt Score Error Units
  85. BenchMarkRocksDbStore.test 4 8 4 512 5000 16 64 thrpt 20 167433.864 ? 43530.883 ops/s
  86. BenchMarkRocksDbStore.test:?stack 4 8 4 512 5000 16 64 thrpt NaN ---