【发布时间】:2017-09-29 16:02:14
【问题描述】:
我在 S3 上有大量想要并行处理的日志文件。我可能会丢弃不需要的记录,否则我只会将记录分批插入数据库。我不一定需要多个键/值对,所以我将一个键映射到所有记录并将其传递给减速器。减速器将只批处理记录并进行数据库调用。只在映射器中完成这一切是否可行?
【问题讨论】:
我在 S3 上有大量想要并行处理的日志文件。我可能会丢弃不需要的记录,否则我只会将记录分批插入数据库。我不一定需要多个键/值对,所以我将一个键映射到所有记录并将其传递给减速器。减速器将只批处理记录并进行数据库调用。只在映射器中完成这一切是否可行?
【问题讨论】:
根据您的描述,是的,您可以在映射器中执行此操作。您可以收集一批记录并确定何时有足够的时间进行批量插入。 cleanup() 方法可用于最后一批,您可能没有收集完整的一批,需要确保插入剩余的记录。
从映射器执行此操作的一个问题是,您对并发运行的数量控制较少,如果输入拆分,它将基于数量。所以你们中有很多人都试图同时插入数据库,这可能是一个问题。使用 reducer,您可以更好地控制将要运行的数量。
你没有说你正在使用什么数据库。过去使用 reducer 对我有帮助的一个案例是在使用分布式数据库时,在这种情况下是 Accumulo,但这可能适用于 HBase,也可能适用于 Cassandra。
Accumulo 平板服务器分布在一个 hadoop 集群周围。因此,一张表将被拆分为多个平板电脑。使用 BatchWriter,您可以从映射器或化简器插入表。但是,如果您从映射器执行此操作,则插入本质上会在集群中随机写入,这会导致更多的网络流量和更多的压缩。使用 reducer,您可以获取目标表的拆分点并使用它们对数据进行分区。这导致平板电脑的所有数据最终都在同一个减速器中。当您以这种方式对数据进行分组时,从 reducer 批量写入会导致插入速度更快。
【讨论】: