【问题标题】:When should I close HTablePool in a MapReduce job?我应该何时在 MapReduce 作业中关闭 HTablePool?
【发布时间】:2013-01-15 19:17:08
【问题描述】:

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

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

欢迎提出任何建议!

【问题讨论】:

    标签: hadoop mapreduce hbase


    【解决方案1】:

    在 Map/Reduce 作业的上下文中,我认为使用 HTablePool 不会给您带来显着的改进。

    HTablePool 带给你的是:

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

    所以我想这真的取决于你的用例,如果你按照你所说的那样使用 Map/Reduce 作业,那么可能不值得使用 HTablePool,因为你仍然需要在 @987654327 中实例化@ 并在每个任务的 cleanup 方法中关闭。

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

    【讨论】:

    • 很伤心 :-( 我应该完全避免在 MapReduce 任务中使用 HTable。谢谢你的回答!
    • HTablePool 对象是否可以发送到每个节点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多