【问题标题】:Bulk Insert/Load in MySQL and HBase在 MySQL 和 HBase 中批量插入/加载
【发布时间】:2013-02-06 22:26:08
【问题描述】:
我的系统有两个进程,其中一个执行单次插入,另一个执行批量插入。显然第二个过程更快,我正在努力将第一个过程迁移到批量插入机制,但今天早上我被一位同事提出的一个问题难住了:“为什么批量插入会比单次插入更快”。
确实,为什么批量插入比单次插入快?
另外,MySQL 和 HBase 中的批量插入和单次插入之间是否存在差异,因为它们的数据库架构完全不同?我在我的项目中都使用了这两种方法,我想知道这两个数据库的批量插入和单次插入是否存在差异。
【问题讨论】:
标签:
mysql
hbase
bulkinsert
bulk-load
【解决方案1】:
据我所知,这也取决于Hbase 配置。通常,批量插入意味着将List of Puts 一起使用,在这种情况下,当您调用table.put 时,插入(在habse 层中称为flushing)会自动完成。单个插入可能会等待任何其他插入调用,以便在中间层进行批量刷新。但是,这也取决于配置。
另一个原因可能是任务的简单性,如果您一次有更多工作,它的 Map 和 Reduce 效率更高。文件块的迁移是针对所有输入单次确定的。但在单独的插入中,这成为一个关键点。
【解决方案2】:
简而言之 - 批量加载操作绕过常规写入路径。这就是它速度快的原因。
那么,当您执行简单的逐行放置操作时,在正常写入过程中会发生什么?
所有数据同时写入 WAL 和 memstore,当 memestore 已满时,数据被刷新到新的 HFile。
但是在 Bulkload 的情况下,它直接写入正在运行的 hbase 集群中的 StoreFile。 NO 中间的东西...
快速提示 - 如果您不想经常使用批量加载,因为它会在短时间内完成,这会给集群带来额外的负担,您可以使用 Put.setWriteToWal(false) 写入 WAL false 以节省一些时间。
但这会增加您的数据丢失机会..