如果我只需要将记录插入数据库,是否需要 reducer?
Do I need a reducer if I just need to insert records into a database?
我在 S3 上有大量日志文件需要并行处理。我可能会丢弃不需要的记录,否则我只会将记录分批插入数据库。我不一定需要多个 key/value 对,所以我将一个键映射到所有记录并将其传递给 reducer。 reducer 只会对记录进行批处理并进行数据库调用。仅在映射器中执行所有操作是否可行?
根据您的描述,是的,您可以在映射器中执行此操作。您可以收集一批记录并确定何时有足够的记录来进行批量插入。 cleanup()
方法可用于最后一批,您可能没有收集完整的批次,需要确保插入剩余的记录。
从映射器执行此操作的一个问题是,您对同时 运行ning 的数量控制较少,如果输入拆分,它将基于数量。所以你们中有很多人都试图同时插入数据库,这可能是一个问题。使用减速器,您可以更好地控制 运行.
的数字
你没有说你使用的是什么数据库。过去使用 reducer 对我有帮助的一个案例是使用分布式数据库,在本例中为 Accumulo,但这可能适用于 HBase,也可能适用于 Cassandra。
Accumulo tablet 服务器分布在一个 hadoop 集群周围。因此,table 将被拆分为多个 tablets。使用 BatchWriter,您可以从映射器或缩减器插入 table。但是,如果您从映射器执行此操作,则插入实际上将随机写入整个集群,这会导致更多的网络流量和更多的压缩。使用减速器,您可以获取目标 table 的拆分点并使用它们对数据进行分区。这导致 tablet 的所有数据最终都在同一个减速器中。当您以这种方式对数据进行分组时,从 reducer 进行 BatchWriting 会导致更快的插入。
我在 S3 上有大量日志文件需要并行处理。我可能会丢弃不需要的记录,否则我只会将记录分批插入数据库。我不一定需要多个 key/value 对,所以我将一个键映射到所有记录并将其传递给 reducer。 reducer 只会对记录进行批处理并进行数据库调用。仅在映射器中执行所有操作是否可行?
根据您的描述,是的,您可以在映射器中执行此操作。您可以收集一批记录并确定何时有足够的记录来进行批量插入。 cleanup()
方法可用于最后一批,您可能没有收集完整的批次,需要确保插入剩余的记录。
从映射器执行此操作的一个问题是,您对同时 运行ning 的数量控制较少,如果输入拆分,它将基于数量。所以你们中有很多人都试图同时插入数据库,这可能是一个问题。使用减速器,您可以更好地控制 运行.
的数字你没有说你使用的是什么数据库。过去使用 reducer 对我有帮助的一个案例是使用分布式数据库,在本例中为 Accumulo,但这可能适用于 HBase,也可能适用于 Cassandra。
Accumulo tablet 服务器分布在一个 hadoop 集群周围。因此,table 将被拆分为多个 tablets。使用 BatchWriter,您可以从映射器或缩减器插入 table。但是,如果您从映射器执行此操作,则插入实际上将随机写入整个集群,这会导致更多的网络流量和更多的压缩。使用减速器,您可以获取目标 table 的拆分点并使用它们对数据进行分区。这导致 tablet 的所有数据最终都在同一个减速器中。当您以这种方式对数据进行分组时,从 reducer 进行 BatchWriting 会导致更快的插入。