首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HBase + TestContainers -端口重构

HBase + TestContainers -端口重构
EN

Stack Overflow用户
提问于 2019-05-03 18:15:55
回答 2查看 693关注 0票数 0

我试图使用试验容器对在Docker容器中启动的HBase进行集成测试。我遇到的问题可能是客户端如何与HBase交互所特有的。

当HBase母版在容器中启动时,它会将其主机名存储在动物园管理员中,以便客户端能够找到它。在本例中,它存储"localhost:16000“。

在我运行在容器外部的测试用例中,客户端从检索"localhost:16000“,并且无法连接。连接失败,因为端口已被TestContainers重新映射到其他一些随机端口,而不是16000。

有什么办法克服这个问题吗?

(1)一个想法是找出一种方法,告诉HBase客户端使用映射端口,而忽略它从检索到的值,但我还没有找到一种方法来这样做。

(2)如果我能让HBase主机编写外部可访问的主机:在动物园管理员的端口,这也将解决问题。但我不认为容器本身对如何进行端口重新映射有任何了解。

(3)也许试验容器为这种情况提供了一种不同的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-03 19:48:31

您可以查看KafkaContainer的实现,我们首先启动一个Socat (快速tcp代理)容器来获取半随机端口,然后使用它来配置目标容器。

算法是:

  1. doStart中,首先启动Socat以获取原始容器的网络别名&像12345这样的端口
  2. 获取映射端口(大约是32109,指向12345)
  3. 使原始容器(例如使用环境变量)在原始端口之外使用映射端口,或者,如果只能配置一个端口,请参见CouchbaseContainer以获得更高级的选项。
  4. 将Socat的主机和端口返回给客户端
票数 1
EN

Stack Overflow用户

发布于 2022-02-25 14:05:19

我们构建了一个hbase的新映像,以满足测试容器的要求。

使用此图像:

码头运行--env HBASE_MASTER_PORT=16000 --env HBASE_REGION_PORT=16020 jcjabouille/hbase-独立:2.4.9

然后创建这个容器(在scala中)

代码语言:javascript
复制
private[test] class GenericHbase2Container
    extends GenericContainer[GenericHbase2Container](
      DockerImageName.parse("jcjabouille/hbase-standalone:2.4.9")
    ) {
  private val randomMasterPort: Int = FreePortFinder.findFreeLocalPort(18000)
  private val randomRegionPort: Int = FreePortFinder.findFreeLocalPort(20000)
  private val hostName: String = InetAddress.getLocalHost.getHostName

  val hbase2Configuration: Configuration = HBaseConfiguration.create
  addExposedPort(randomMasterPort)
  addExposedPort(randomRegionPort)
  addExposedPort(2181)
  withCreateContainerCmdModifier { cmd: CreateContainerCmd =>
    cmd.withHostName(hostName)
    ()
  }
  waitingFor(Wait.forLogMessage(".*0 row.*", 1))
  withStartupTimeout(Duration.ofMinutes(10))
  withEnv("HBASE_MASTER_PORT", randomMasterPort.toString)
  withEnv("HBASE_REGION_PORT", randomRegionPort.toString)
  setPortBindings(Seq(s"$randomMasterPort:$randomMasterPort", s"$randomRegionPort:$randomRegionPort").asJava)

  override protected def doStart(): Unit = {
    super.doStart()
    hbase2Configuration.set("hbase.client.pause", "200")
    hbase2Configuration.set("hbase.client.retries.number", "10")
    hbase2Configuration.set("hbase.rpc.timeout", "3000")
    hbase2Configuration.set("hbase.client.operation.timeout", "3000")
    hbase2Configuration.set("hbase.client.scanner.timeout.period", "10000")
    hbase2Configuration.set("zookeeper.session.timeout", "10000")
    hbase2Configuration.set("hbase.zookeeper.quorum", "localhost")
    hbase2Configuration.set("hbase.zookeeper.property.clientPort", getMappedPort(2181).toString)
  }
}

这里有更多详细信息:https://hub.docker.com/r/jcjabouille/hbase-standalone

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55975205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档