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