如何在没有 MapReduce 的情况下在 HBase 中进行分布式更新

Posted

技术标签:

【中文标题】如何在没有 MapReduce 的情况下在 HBase 中进行分布式更新【英文标题】:How to do distributed updates in HBase without MapReduce 【发布时间】:2013-12-16 20:44:54 【问题描述】:

问题

我有一些工作只需要遍历 HBase 表中的每条记录并执行一些任务。例如,为导出提取字段或根据一些新的业务规则更新字段。

推理

MapReduce 在这里似乎有点矫枉过正。没有什么可以真正映射,也没有“减少”。地图始终只是键+记录。 shuffle 和 sort 肯定没有用,因为它们的键在 HBase 中保证是唯一的。

出于性能原因,这仍应分发。我想我正在寻找一个很好的老式表格扫描,它恰好是分发的。

问题

存在哪些选项可以利用集群但避免完整 MapReduce 作业的不必要步骤?

【问题讨论】:

【参考方案1】:

Co-processors 正是为此而生。来自链接:“用于灵活和通用扩展的框架,以及直接在 HBase 服务器进程内进行分布式计算的框架”。

【讨论】:

虽然它并没有真正分发。 hbase.hregion.max.filesize 默认为 10737418240。因此,如果表小于该值,则整个表将在单个节点上进行处理,而不是以分布式方式。 呃……你的意思是什么?如果你有一张只有一个区域的表,那你就错了。 这就像说 mapreduce 不是分布式的,因为我可能只在一个块上运行 mapreduce 作业。 如果有一个包含 2GB 数据的表,那么协处理器将在单个节点上处理单个区域。将其拆分为 128mb 区域进行分布式处理将是一个糟糕的选择。如果相同的 2gb 数据在 hdfs 中,由于复制,mr 处理更有可能分布在相同的 128mb 块的多个节点上。只是我的2c。需要考虑更多。 @PraveenSripati 我们所讨论的表分布在数百个地区的数十台服务器上。【参考方案2】:

你可以只做地图的工作——它会做你想做的事 要获得仅地图工作,您可以使用 TableMapReduceUtil.initTableMapperJobhelper 方法 并且不设置减速器job.setNumReduceTasks(0);

如果您为扫描指定过滤器,您还可以将一些处理推送到 hbase

【讨论】:

我们已经尝试过了。然而,基本问题是我们似乎无法让仅映射器的作业运行得与将所有计算传递给减速器的作业一样快。也许是因为我们无法配置映射器的数量,而您可以配置减速器的数量?我们不确定这是 M/R 作业的设计还是配置。谢谢。 使用 HBase 的 map/reduce 会为每个区域创建一个映射 - 如果您将区域划分得足够好,您将拥有尽可能多的并行度。 非常感谢,会调查的。

以上是关于如何在没有 MapReduce 的情况下在 HBase 中进行分布式更新的主要内容,如果未能解决你的问题,请参考以下文章

windows下在eclipse上远程连接hadoop集群调试mapreduce错误记录

如何在没有添加的情况下在 Heroku 中启用堆栈跟踪

如何在没有中间目录的情况下在图库中编写视频?

如何在没有静态文本的情况下在 XCTest 中快速测试 Webview 是不是加载

如何在没有 IdlingResource 的情况下在 Espresso 中等待异步任务

如何在没有用户交互的情况下在后台接收 iOS 通知