我试图使用HTablePool
来减少HTable实例的创建。然而,我不知道在我的映射器/还原器我应该把HTablePool.close()
。
当应用程序运行时,调用多个映射器,reducer,它们可以在多台机器上运行。为了获得最佳性能,我认为每台机器应该有一个HTablePool
,并且close()
调用应该延迟到整个应用程序关闭为止。但是我们如何告诉这些机器关闭它们的池呢?
欢迎任何建议!
在Map/Reduce作业中,我认为使用HTablePool
不会带来显著的改进。
HTablePool
带给你的是:
-
线程安全:
HTablePool
为您的表使用SynchronizedMap
,因此在多线程应用程序的上下文中,这很方便。然而,在Map/Reduce作业的上下文中,你有多个节点,任务是独立的,所以这并不能真正帮助你。 -
池化对象:由于它是一个池,这允许您避免每次实例化
HTable
的需要。如果你有连续访问HBase的并发请求,这是一个有效的语句,但对于Map/Reduce作业来说就不是那么多了,因为你每个任务实例化一次表。
所以我想这真的取决于你的用例,如果你正在使用Map/Reduce作业,那么它可能不值得用HTablePool
,因为你仍然需要在setup
中实例化,并在cleanup
方法中关闭每个任务。
我考虑使用HTablePool
的唯一用例是具有大量并发请求的高频多线程应用程序——在这种情况下,使用池绝对是一个合适的用例。