1

我正在尝试使用HTablePool来减少 HTable 实例的创建。但是我不知道应该在我的映射器/减速器中的哪个位置放置HTablePool.close().

当应用程序运行时,会调用多个映射器、减速器,它们可以在多台机器上运行。为了获得最佳性能增益,我认为HTablePool每台机器都应该有一个,并且close()调用应该延迟到整个应用程序关闭为止。但是我们怎么能告诉那些机器关闭它们的池呢?

欢迎任何建议!

4

1 回答 1

1

在 Map/Reduce 工作的上下文中,我不认为 usingHTablePool会给你带来显着的改进。

anHTablePool带给你的是:

  • 线程安全:为您的表HTablePool使用 a SynchronizedMap,因此在多线程应用程序的上下文中这很方便。但是,在 Map/Reduce 作业的上下文中,您有多个节点并且任务是独立的,因此这并不能真正帮助您。
  • 池化对象:由于它是一个池,因此您可以避免HTable每次都实例化 s 的需要。如果您有例如连续访问 HBase 的并发请求,这是一个有效的声明,但对于 Map/Reduce 作业来说不是那么多,因为您为每个任务实例化一次表。

所以我想这真的取决于你的用例,如果你像你说的那样使用 Map/Reduce 作业,那么它可能不值得去做,HTablePool因为你仍然需要在每个任务setup的方法中实例化和关闭cleanup.

我会考虑使用的唯一用例HTablePool是具有大量并发请求的高频多线程应用程序 - 在这种情况下,使用池绝对是一个合适的用例。

于 2013-01-15T22:23:03.267 回答