开发人员至少应该熟悉单元测试细节; HBase 中的单元测试具有其他项目中通常不会出现的特征。

此信息是关于 HBase 本身的单元测试。有关为 HBase 应用程序开发单元测试的信息,请参阅 unit.tests

173.1。 Apache HBase 模块

截至 0.96,Apache HBase 分为多个模块。这为编写测试的方式和位置创建了“有趣的”规则。如果您正在为hbase-server编写代码,请参阅 hbase.unittests 以了解如何编写测试。这些测试可以启动 minicluster 并需要进行分类。对于任何其他模块,例如hbase-common,测试必须是严格的单元测试,并且只测试被测试的类 - 不允许使用 HBaseTestingUtility 或 minicluster(或者甚至可以给定依赖树)。

173.1.1。测试 HBase Shell

HBase shell 及其测试主要用 jruby 编写。

为了使这些测试作为标准构建的一部分运行,有一些 JUnit 测试类负责加载 jruby 实现的测试并运行它们。测试分为不同的类,以适应类级超时(详见单元测试)。您可以从顶层运行所有这些测试:

 mvn clean test -Dtest=Test*Shell 

如果您之前已经完成了mvn install,那么您可以指示 maven 仅运行 hbase-shell 模块中的测试:

 mvn clean test -pl hbase-shell 

或者,您可以限制使用系统变量shell.test运行的 shell 测试。此值应按名称指定特定测试用例的 ruby 文字等效项。例如,覆盖用于更改表的 shell 命令的测试包含在测试用例AdminAlterTableTest中,您可以使用以下命令运行它们:

 mvn clean test -pl hbase-shell -Dshell.test=/AdminAlterTableTest/ 

您还可以使用 Ruby Regular Expression 文字/pattern/样式)来选择一组测试用例。您可以使用以下命令运行所有与 HBase 管理相关的测试,包括正常管理和安全管理:

 mvn clean test -pl hbase-shell -Dshell.test=/.*Admin.*Test/ 

如果测试失败,您可以通过检查 surefire 报告结果的 XML 版本来查看详细信息

 vim hbase-shell/target/surefire-reports/TEST-org.apache.hadoop.hbase.client.TestShell.xml 

173.1.2。在其他模块中运行测试

如果您正在开发的模块没有其他 HBase 模块的其他依赖项,那么您可以进入该模块并运行:

mvn test 

这将只运行模块中的测试。如果其他模块存在其他依赖关系,那么您将从 ROOT HBASE DIRECTORY 运行该命令。这将在其他模块中运行测试,除非您指定跳过该模块中的测试。例如,要跳过 hbase-server 模块中的测试,您将运行:

mvn clean test -PskipServerTests 

从顶级目录运行除 hbase-server 之外的模块中的所有测试。请注意,您可以指定跳过多个模块中的测试以及单个模块的测试。例如,要跳过hbase-serverhbase-common中的测试,您将运行:

mvn clean test -PskipServerTests -PskipCommonTests 

另外,请记住,如果在hbase-server模块中运行测试,则需要应用 hbase.unittests.cmds 中讨论的 maven 配置文件,以使测试正常运行。

173.2。单元测试

Apache HBase 单元测试必须带有类别注释,从hbase-2.0.0开始,必须加上 HBase ClassRule。以下是包含 Category 和 ClassRule 的 Test Class 的示例:

...
@Category(SmallTests.class)
public class TestHRegionInfo {
  @ClassRule
  public static final HBaseClassTestRule CLASS_RULE =
      HBaseClassTestRule.forClass(TestHRegionInfo.class);

  @Test
  public void testCreateHRegionInfoName() throws Exception {
    // ...
  }
} 

这里的测试类是TestHRegionInfoCLASS_RULE在每个测试类中具有相同的形式,只有你传递的.class是本地测试的形式;即在 TestTimeout 测试类中,你将TestTimeout.class传递给CLASS_RULE而不是我们上面的TestHRegionInfo.classCLASS_RULE是我们强制执行超时的(目前设置为所有测试的硬限制为 13 分钟 - 780 秒)和其他跨单元测试设施。测试在SmallTest类别中。

类别可以是任意的,并作为列表提供,但每个测试必须携带以下列表中的一个:smallmediumlargeintegration。使用 JUnit 类别SmallTestsMediumTestsLargeTestsIntegrationTests指定测试大小。 JUnit 类别使用 java 注释表示(特殊单元测试在所有单元 tess 中查找@Category 注释的存在,如果发现测试套件缺少大小标记,则会失败)。

前三个类别smallmediumlarge用于键入$ mvn test时运行的测试用例。换句话说,这三个分类用于 HBase 单元测试。 integration类别不是用于单元测试,而是用于集成测试。这些通常在您调用$ mvn verify时运行。集成测试在 integration.tests 中描述。

继续阅读以确定新的 HBase 测试用例上的集合smallmediumlarge的注释。

分类测试

小测试

_ 小型 _ 测试用例在共享 JVM 中执行,每个测试套件/测试类应在 15 秒或更短时间内运行;即一个 junit 测试夹具,一个由测试方法组成的 java 对象,应该在 15 秒内完成,无论它有多少或几乎没有测试方法。这些测试用例不应使用 minicluster。

中等测试

_ 中 _ 测试用例在单独的 JVM 和单独的测试套件或测试类中执行,或者以 junit 的说法执行,测试夹具应该在 50 秒或更短的时间内运行。这些测试用例可以使用迷你集群。

大型测试

_ 大型 _ 测试案例就是其他一切。它们通常是大规模测试,特定错误的回归测试,超时测试或性能测试。没有大型测试套件可能需要超过十分钟。随着时间的推移会被杀死。如果需要运行更长时间,请将测试作为集成测试。

集成测试

_ 集成 _ 测试是系统级测试。有关详细信息,请参阅 integration.tests 。如果在集成测试中调用$ mvn test,则测试没有超时。

173.3。运行测试

173.3.1。默认值:中小类别测试

运行mvn test将在单个 JVM(无分支)中执行所有小测试,然后在单独的 JVM 中为每个测试实例执行中等测试。如果小测试中存在错误,则不执行中等测试。不执行大型测试。

173.3.2。运行所有测试

运行mvn test -P runAllTests将在单个 JVM 中执行小型测试,然后在单独的 JVM 中为每个测试执行中型和大型测试。如果小测试中存在错误,则不执行中型和大型测试。

173.3.3。在包中运行单个测试或所有测试

要进行单独测试,例如MyTest,朗姆酒mvn test -Dtest=MyTest您还可以将多个单独的测试作为逗号分隔列表传递:

mvn test  -Dtest=MyTest1,MyTest2,MyTest3 

您还可以传递一个包,它将运行包下的所有测试:

mvn test '-Dtest=org.apache.hadoop.hbase.client.*' 

指定-Dtest时,将使用localTests配置文件。每个 junit 测试都在一个单独的 JVM(每个测试类的一个 fork)中执行。在此模式下运行测试时没有并行化。您将在-report 的末尾看到一条新消息:"[INFO] Tests are skipped"。这是无害的。但是,您需要确保测试报告的Results:部分中Tests run:的总和与您指定的测试数相匹配,因为在指定不存在的测试用例时不会报告错误。

173.3.4。其他测试调用排列

运行mvn test -P runSmallTests将仅使用单个 JVM 执行“小”测试。

运行mvn test -P runMediumTests将仅执行“中”测试,为每个测试类启动一个新的 JVM。

运行mvn test -P runLargeTests将仅执行“大型”测试,为每个测试类启动一个新的 JVM。

为方便起见,您可以使用单个 JVM 运行mvn test -P runDevTests来执行小型和中型测试。

173.3.5。更快地运行测试

默认情况下,$ mvn test -P runAllTests并行运行 5 个测试。它可以在开发人员的机器上增加。允许每个核心可以并行进行 2 次测试,每次测试需要大约 2GB 内存(在极端情况下),如果你有 8 核 24GB 盒子,你可以并行进行 16 次测试。但可用内存将其限制为 12(24/2),要并行执行 12 次测试的所有测试,请执行以下操作:mvn test -P runAllTests -Dsurefire.secondPartForkCount = 12。如果使用早于 2.0 的版本,请执行:+ mvn test -P runAllTests -Dsurefire.secondPartThreadCount = 12 +。要提高速度,您也可以使用 ramdisk。您将需要 2GB 的内存来运行所有测试。您还需要在两次测试运行之间删除文件。在 Linux 上配置 ramdisk 的典型方法是:

$ sudo mkdir /ram2G
sudo mount -t tmpfs -o size=2048M tmpfs /ram2G 

然后,您可以使用以下命令在 2.0 上运行所有 HBase 测试:

mvn test
                        -P runAllTests -Dsurefire.secondPartForkCount=12
                        -Dtest.build.data.basedirectory=/ram2G 

在早期版本中,使用:

mvn test
                        -P runAllTests -Dsurefire.secondPartThreadCount=12
                        -Dtest.build.data.basedirectory=/ram2G 

173.3.6。 hbasetests.sh

也可以使用脚本 hbasetests.sh。此脚本与两个 maven 实例并行运行中型和大型测试,并提供单个报告。此脚本不使用 surefire 的 hbase 版本,因此除了脚本设置的两个 maven 实例之外,不会进行任何并行化。它必须从包含 pom.xml 的目录执行。

例如,运行./dev-support/hbasetests.sh 将执行中小型测试。运行./dev-support/hbasetests.sh runAllTests 将执行所有测试。运行./dev-support/hbasetests.sh replayFailed 将在单独的 jvm 中重新运行失败的测试,并且没有并行化。

173.3.7。测试超时

不严格执行 HBase 单元测试大小分类超时。

任何运行时间超过十分钟的测试都将超时/终止。

从 hbase-2.0.0 开始,我们已经清除了所有的每个测试方法超时:即

...
  @Test(timeout=30000)
  public void testCreateHRegionInfoName() throws Exception {
    // ...
  } 

考虑到我们是整个测试夹具/类/套件需要多长时间的基础,并且测试方法所需的时间差异在很大程度上取决于上下文(加载的 Apache 基础设施与开发人员机器),因此他们不鼓励并且没有多大意义没有别的东西在上面运行)。

173.3.8。测试资源检查器

自定义 Maven SureFire 插件监听器在每个 HBase 单元测试运行之前和之后检查许多资源,并在测试输出文件的末尾记录其结果,这些文件可以在每个 Maven 模块的 target / surefire-reports 中找到(测试将为测试类命名的测试报告写入此目录。检查 * -out.txt 文件)。计算的资源是线程数,文件描述符数等。如果数量增加,它会增加 LEAK? 在日志中发表评论。由于您可以在后台运行 HBase 实例,因此可以删除/创建一些线程,而无需在测试中执行任何特定操作。但是,如果测试不能按预期工作,或者测试不会影响这些资源,则值得检查这些日志行... hbase.ResourceChecker(157):before ...和... hbase.ResourceChecker(157 ):之后....例如:

2012-09-26 09:22:15,315 INFO [pool-1-thread-1]
hbase.ResourceChecker(157): after:
regionserver.TestColumnSeeking#testReseeking Thread=65 (was 65),
OpenFileDescriptor=107 (was 107), MaxFileDescriptor=10240 (was 10240),
ConnectionCount=1 (was 1) 

173.4。写测试

173.4.1。通用规则

  • 尽可能将测试编写为类别小测试。

  • 必须编写所有测试以支持在同一台机器上并行执行,因此它们不应将共享资源用作固定端口或固定文件名。

  • 测试不应该过度。超过 100 行/秒使得日志复杂化以便读取和使用 i / o,因此不能用于其他测试。

  • 可以使用HBaseTestingUtility编写测试。此类提供辅助函数来创建临时目录并执行清理或启动集群。

173.4.2。类别和执行时间

  • 必须对所有测试进行分类,否则可以跳过它们。

  • 所有测试都应尽可能快地编写。

  • 见&lt; <hbase.unittests>用于测试用例类别和相应的超时。这应确保使用它的人员具有良好的并行性,并在测试失败时简化分析。</hbase.unittests>

173.4.3。在测试中睡觉

只要有可能,测试不应该使用 Thread.sleep,而是等待他们需要的真实事件。这对读者来说更快更清晰。测试不应该在没有测试结束条件的情况下执行 Thread.sleep。这样可以了解测试正在等待的内容。而且,无论机器性能如何,测试都能正常工作。睡眠应该尽可能快。等待变量应该在 40ms 的睡眠循环中完成。等待套接字操作应该在 200 毫秒的睡眠循环中完成。

173.4.4。使用群集进行测试

使用 HRegion 进行的测试不必启动集群:区域可以使用本地文件系统。启动/停止群集成本大约 10 秒。它们不应该按照测试方法而是按测试类启动。必须使用 HBaseTestingUtility#shutdownMiniCluster 关闭已启动的集群,该程序清除目录。尽可能多地,测试应使用群集的默认设置。如果他们不这样做,他们应该记录下来。这将允许稍后共享群集。

173.4.5。测试骨架代码

这是一个带有分类和基于类别的超时规则的测试框架代码,用于复制和粘贴并用作测试贡献的基础。

/**
 * Describe what this testcase tests. Talk about resources initialized in @BeforeClass (before
 * any test is run) and before each test is run, etc.
 */
// Specify the category as explained in <<hbase.unittests,hbase.unittests>>.
@Category(SmallTests.class)
public class TestExample {
  // Replace the TestExample.class in the below with the name of your test fixture class.
  private static final Log LOG = LogFactory.getLog(TestExample.class);

  // Handy test rule that allows you subsequently get the name of the current method. See
  // down in 'testExampleFoo()' where we use it to log current test's name.
  @Rule public TestName testName = new TestName();

  // The below rule does two things. It decides the timeout based on the category
  // (small/medium/large) of the testcase. This @Rule requires that the full testcase runs
  // within this timeout irrespective of individual test methods' times. The second
  // feature is we'll dump in the log when the test is done a count of threads still
  // running.
  @Rule public static TestRule timeout = CategoryBasedTimeout.builder().
    withTimeout(this.getClass()).withLookingForStuckThread(true).build();

  @Before
  public void setUp() throws Exception {
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testExampleFoo() {
    LOG.info("Running test " + testName.getMethodName());
  }
} 

173.5。集成测试

HBase 集成/系统测试是超出 HBase 单元测试的测试。它们通常是持久的,相当大的(测试可以被要求为 1M 行或 1B 行),可以定位(它们可以采取配置,将它们指向它们要运行的现成集群;集成测试不包括集群启动/停止代码),并验证成功,集成测试仅依赖于公共 API;他们不会尝试检查服务器内部断言成功/失败。当您需要对单元测试可以执行的发布候选项进行更详细的校对时,您将运行集成测试。它们通常不在 Apache Continuous Integration 构建服务器上运行,但是,一些站点选择运行集成测试作为其在实际集群上进行连续测试的一部分。

集成测试目前位于 hbase-it 子模块中的 src / test 目录下,并且将匹配正则表达式: *** / IntegrationTest** .java 。所有集成测试也使用@Category(IntegrationTests.class)进行注释。

集成测试可以以两种模式运行:使用迷你集群,或针对实际的分布式集群。 Maven failsafe 用于使用迷你集群运行测试。 IntegrationTestsDriver 类用于对分布式集群执行测试。集成测试不应该假设它们是针对迷你集群运行的,并且不应该使用私有 API 来访问集群状态。要统一地与分布式或迷你集群交互,可以使用IntegrationTestingUtilityHBaseCluster类以及公共客户端 API。

在分布式群集上,使用 ChaosMonkey 的集成测试或通过集群管理器(例如,重新启动区域服务器)操纵服务的集成测试使用 SSH 来执行此操作。要运行这些,测试进程应该能够在远程端运行命令,因此应该相应地配置 ssh(例如,如果 HBase 在集群中的 hbase 用户下运行,则可以为该用户设置无密码 ssh 并运行测试在它下面)。为此,可以使用hbase.it.clustermanager.ssh.userhbase.it.clustermanager.ssh.optshbase.it.clustermanager.ssh.cmd配置设置。 “User”是集群管理器用于执行 ssh 命令的远程用户。 “Opts”包含传递给 SSH 的其他选项(例如,“ - i / tmp / my-key”)。最后,如果您有一些自定义环境设置,“cmd”是整个隧道(ssh)命令的覆盖格式。默认字符串是{/usr/bin/ssh %1$s %2$s%3$s%4$s "%5$s"},是一个很好的起点。这是一个标准的 Java 格式字符串,带有 5 个参数,用于执行远程命令。参数 1(%1 $ s)是 SSH 选项设置 via opts 设置或通过环境变量,2 是 SSH 用户名,如果设置了 username,则 3 是“@”,否则,“4”是目标主机名,并且 5 是要执行的逻辑命令(可能包括单引号,因此不要使用它们)。例如,如果您在非 hbase 用户下运行测试并希望 ssh 作为该用户并在远程计算机上更改为 hbase,则可以使用:

/usr/bin/ssh %1$s %2$s%3$s%4$s "su hbase - -c \"%5$s\"" 

这样,杀死 RS(例如)集成测试可能会运行:

{/usr/bin/ssh some-hostname "su hbase - -c \"ps aux | ... | kill ...\""} 

该命令记录在测试日志中,因此您可以验证它是否适合您的环境。

要禁用集成测试的运行,请在命令行-PskipIntegrationTests上传递以下配置文件。例如,

$ mvn clean install test -Dtest=TestZooKeeper  -PskipIntegrationTests 

173.5.1。针对迷你群集运行集成测试

HBase 0.92 添加了verify maven 目标。调用它,例如通过执行mvn verify,将通过 maven 故障安全插件运行所有阶段,包括验证阶段,运行所有上述 HBase 单元测试以及中的测试 HBase 集成测试组。完成 mvn install -DskipTests 后,您可以通过调用以下命令运行集成测试:

cd hbase-it
mvn verify 

如果您只想在顶层运行集成测试,则需要运行两个命令。第一:mvn failsafe:integration-test 这实际上运行所有集成测试。

即使存在测试失败,该命令也将始终输出BUILD SUCCESS

此时,您可以手动查找输出失败的测试。但是,maven 会为我们这样做;只需使用:mvn failsafe:verify 上面的命令基本上查看了测试失败的所有测试结果(因此不要删除'target'目录)并报告结果。

运行 Integration 测试的子集

这与您指定运行单元测试子集(参见上文)的方式非常相似,但使用属性it.test而不是test。要运行IntegrationTestClassXYZ.java,请使用:mvn failsafe:integration-test -Dit.test = IntegrationTestClassXYZ 您可能要做的下一件事是运行集成测试组,例如所有名为 IntegrationTestClassX .java 的集成测试: mvn failsafe:integration-test -Dit.test = ClassX _ 这将运行与 ClassX 匹配的集成测试。这意味着任何匹配:“**_ / IntegrationTest ClassX **”。您还可以使用逗号分隔列表运行多组集成测试(类似于单元测试)。使用匹配列表仍支持每个组的完整正则表达式匹配。这看起来像:mvn failsafe:integration-test -Dit.test = ClassX ClassY

173.5.2。针对分布式群集运行集成测试

如果您已经安装了 HBase 集群,则可以通过调用类IntegrationTestsDriver来启动集成测试。您可能必须先运行 test-compile。配置将由 bin / hbase 脚本选取。

mvn test-compile 

然后启动测试:

bin/hbase [--config config_dir] org.apache.hadoop.hbase.IntegrationTestsDriver 

通过-h来使用这个甜蜜的工具。不带任何参数运行 IntegrationTestsDriver 将启动在hbase-it/src/test下找到的测试,具有@Category(IntegrationTests.class)注释,名称以IntegrationTests开头。通过传递-h 来查看用法,以了解如何过滤测试类。您可以传递一个正则表达式,该正则表达式将根据完整的类名进行检查;所以,可以使用类名的一部分。 IntegrationTestsDriver 使用 Junit 来运行测试。目前,不支持使用 maven 对分布式集群运行集成测试(参见 HBASE-6201 )。

测试通过使用DistributedHBaseCluster(实现HBaseCluster)类中的方法与分布式集群交互,后者又使用可插入的ClusterManager。具体实现提供了用于执行特定于部署和环境的任务(SSH 等)的实际功能。默认ClusterManagerHBaseClusterManager,它使用 SSH 远程执行 start / stop / kill / signal 命令,并假设一些 posix 命令(ps 等)。还假设运行测试的用户具有足够的“电源”来启动/停止远程计算机上的服务器。默认情况下,它从 env 中获取HBASE_SSH_OPTSHBASE_HOMEHBASE_CONF_DIR,并使用bin/hbase-daemon.sh执行操作。目前支持 tarball 部署,使用 hbase-daemons.shApache Ambari 部署的部署。 /etc/init.d/ 脚本现在不受支持,但可以轻松添加。对于其他部署选项,可以实现和插入 ClusterManager。

173.5.3。破坏性集成/系统测试(ChaosMonkey)

HBase 0.96 引入了一个名为ChaosMonkey的工具,该工具以 Netflix 的混沌猴工具的同名工具为蓝本。 ChaosMonkey 通过终止或断开随机服务器或将其他故障注入环境来模拟正在运行的集群中的实际故障。您可以使用 ChaosMonkey 作为独立工具在其他测试运行时运行策略。在某些环境中,ChaosMonkey 始终在运行,以便不断检查高可用性和容错是否按预期工作。

ChaosMonkey 定义动作策略

操作

操作是预定义的事件序列,例如:

  • 重启活动主人(睡 5 秒)

  • 重启随机区域服务器(睡 5 秒)

  • 重启随机区域服务器(睡眠 60 秒)

  • 重启 META regionserver(睡 5 秒)

  • 重启 ROOT regionserver(睡 5 秒)

  • 批量重启 50%的区域服务器(睡眠 5 秒)

  • 滚动重启 100%的区域服务器(睡眠 5 秒)

政策

策略是用于执行一个或多个动作的策略。默认策略基于预定义的操作权重每分钟执行一次随机操作。在 ChaosMonkey 中断之前,将执行给定的策略。

大多数 ChaosMonkey 操作都配置为具有合理的默认值,因此您可以针对现有群集运行 ChaosMonkey,而无需任何其他配置。以下示例使用默认配置运行 ChaosMonkey:

$ bin/hbase org.apache.hadoop.hbase.util.ChaosMonkey

12/11/19 23:21:57 INFO util.ChaosMonkey: Using ChaosMonkey Policy: class org.apache.hadoop.hbase.util.ChaosMonkey$PeriodicRandomActionPolicy, period:60000
12/11/19 23:21:57 INFO util.ChaosMonkey: Sleeping for 26953 to add jitter
12/11/19 23:22:24 INFO util.ChaosMonkey: Performing action: Restart active master
12/11/19 23:22:24 INFO util.ChaosMonkey: Killing master:master.example.com,60000,1353367210440
12/11/19 23:22:24 INFO hbase.HBaseCluster: Aborting Master: master.example.com,60000,1353367210440
12/11/19 23:22:24 INFO hbase.ClusterManager: Executing remote command: ps aux | grep master | grep -v grep | tr -s ' ' | cut -d ' ' -f2 | xargs kill -s SIGKILL , hostname:master.example.com
12/11/19 23:22:25 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:
12/11/19 23:22:25 INFO hbase.HBaseCluster: Waiting service:master to stop: master.example.com,60000,1353367210440
12/11/19 23:22:25 INFO hbase.ClusterManager: Executing remote command: ps aux | grep master | grep -v grep | tr -s ' ' | cut -d ' ' -f2 , hostname:master.example.com
12/11/19 23:22:25 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:
12/11/19 23:22:25 INFO util.ChaosMonkey: Killed master server:master.example.com,60000,1353367210440
12/11/19 23:22:25 INFO util.ChaosMonkey: Sleeping for:5000
12/11/19 23:22:30 INFO util.ChaosMonkey: Starting master:master.example.com
12/11/19 23:22:30 INFO hbase.HBaseCluster: Starting Master on: master.example.com
12/11/19 23:22:30 INFO hbase.ClusterManager: Executing remote command: /homes/enis/code/hbase-0.94/bin/../bin/hbase-daemon.sh --config /homes/enis/code/hbase-0.94/bin/../conf start master , hostname:master.example.com
12/11/19 23:22:31 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:starting master, logging to /homes/enis/code/hbase-0.94/bin/../logs/hbase-enis-master-master.example.com.out
....
12/11/19 23:22:33 INFO util.ChaosMonkey: Started master: master.example.com,60000,1353367210440
12/11/19 23:22:33 INFO util.ChaosMonkey: Sleeping for:51321
12/11/19 23:23:24 INFO util.ChaosMonkey: Performing action: Restart random region server
12/11/19 23:23:24 INFO util.ChaosMonkey: Killing region server:rs3.example.com,60020,1353367027826
12/11/19 23:23:24 INFO hbase.HBaseCluster: Aborting RS: rs3.example.com,60020,1353367027826
12/11/19 23:23:24 INFO hbase.ClusterManager: Executing remote command: ps aux | grep regionserver | grep -v grep | tr -s ' ' | cut -d ' ' -f2 | xargs kill -s SIGKILL , hostname:rs3.example.com
12/11/19 23:23:25 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:
12/11/19 23:23:25 INFO hbase.HBaseCluster: Waiting service:regionserver to stop: rs3.example.com,60020,1353367027826
12/11/19 23:23:25 INFO hbase.ClusterManager: Executing remote command: ps aux | grep regionserver | grep -v grep | tr -s ' ' | cut -d ' ' -f2 , hostname:rs3.example.com
12/11/19 23:23:25 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:
12/11/19 23:23:25 INFO util.ChaosMonkey: Killed region server:rs3.example.com,60020,1353367027826\. Reported num of rs:6
12/11/19 23:23:25 INFO util.ChaosMonkey: Sleeping for:60000
12/11/19 23:24:25 INFO util.ChaosMonkey: Starting region server:rs3.example.com
12/11/19 23:24:25 INFO hbase.HBaseCluster: Starting RS on: rs3.example.com
12/11/19 23:24:25 INFO hbase.ClusterManager: Executing remote command: /homes/enis/code/hbase-0.94/bin/../bin/hbase-daemon.sh --config /homes/enis/code/hbase-0.94/bin/../conf start regionserver , hostname:rs3.example.com
12/11/19 23:24:26 INFO hbase.ClusterManager: Executed remote command, exit code:0 , output:starting regionserver, logging to /homes/enis/code/hbase-0.94/bin/../logs/hbase-enis-regionserver-rs3.example.com.out

12/11/19 23:24:27 INFO util.ChaosMonkey: Started region server:rs3.example.com,60020,1353367027826\. Reported num of rs:6 

输出表明 ChaosMonkey 启动了默认的PeriodicRandomActionPolicy策略,该策略配置了所有可用的操作。它选择运行RestartActiveMasterRestartRandomRs动作。

173.5.4。可用政策

HBase 附带了几个 ChaosMonkey 策略,可在hbase/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/policies/目录中找到。

173.5.5。配置单个 ChaosMonkey 操作

可以在每次测试运行中配置 ChaosMonkey 集成测试。在 HBase CLASSPATH 中创建 Java 属性文件,并使用-monkeyProps配置标志将其传递给 ChaosMonkey。可配置属性及其默认值(如果适用)列在org.apache.hadoop.hbase.chaos.factories.MonkeyConstants类中。对于具有默认值的属性,可以通过将它们包含在属性文件中来覆盖它们。

以下示例使用名为 monkey.properties 的属性文件。

$ bin/hbase org.apache.hadoop.hbase.IntegrationTestIngest -m slowDeterministic -monkeyProps monkey.properties 

上面的命令将启动集成测试和混乱猴子。它将在 HBase CLASSPATH 上查找属性文件 monkey.properties ;例如在 HBASE conf dir 里面。

这是一个混乱的猴子文件示例:

示例 ChaosMonkey 属性文件

sdm.action1.period=120000
sdm.action2.period=40000
move.regions.sleep.time=80000
move.regions.max.time=1000000
move.regions.sleep.time=80000
batch.restart.rs.ratio=0.4f 

周期/时间以毫秒表示。

HBase 1.0.2 和更新版本增加了重启 HBase 底层 ZooKeeper 仲裁或 HDFS 节点的能力。要使用这些操作,您需要在 ChaosMonkey 属性文件中配置一些新属性,这些属性没有合理的默认值,因为它们是特定于部署的,可能是hbase-site.xml或不同的属性文件。

<property>
  <name>hbase.it.clustermanager.hadoop.home</name>
  <value>$HADOOP_HOME</value>
</property>
<property>
  <name>hbase.it.clustermanager.zookeeper.home</name>
  <value>$ZOOKEEPER_HOME</value>
</property>
<property>
  <name>hbase.it.clustermanager.hbase.user</name>
  <value>hbase</value>
</property>
<property>
  <name>hbase.it.clustermanager.hadoop.hdfs.user</name>
  <value>hdfs</value>
</property>
<property>
  <name>hbase.it.clustermanager.zookeeper.user</name>
  <value>zookeeper</value>
</property>