gpt4 book ai didi

"customers who bought x also bought y"的 Hadoop 数据流效率

转载 作者:可可西里 更新时间:2023-11-01 14:23:38 27 4
gpt4 key购买 nike

我正在开始使用 Hadoop,并致力于为“购买了 x 的客户也购买了 y”构建 MapReduce 链,其中 y 是与 x 一起购买最频繁的产品。我正在寻找有关提高此任务效率的建议,我的意思是减少从映射器节点转移到缩减器节点的数据量。我的目标与其他“客户购买 x”场景略有不同,因为我只想存储给定产品的最常购买产品,而不是按给定产品排名的购买产品列表频率。

我正在关注 this blog post指导我的方法。

如果,据我所知,Hadoop 中最大的性能限制因素之一是将数据从映射器节点改组到缩减器节点,那么,对于 MapReduce 链的每个阶段,我希望将改组后的数据量保持在一定水平最小值。

假设我的初始数据集是一个 SQL 表 purchases_products ,购买和在该购买中购买的产品之间的连接表。我喂select x.product_id, y.product_id from purchases_products x inner join purchases_products y on x.purchase_id = y.purchase_id and x.product_id != y.product_id进入我的 MapReduce 操作。

我的 MapReduce 策略是映射 product_id_x, product_id_yproduct_id_x_product_id_y, 1然后在我的 reduce 步骤中总结这些值。最后,我可以将键和存储对拆分回 SQL 表。

我对这个操作的问题是它打乱了可能大量的行,即使我想要生成的结果集的大小只有 count(products)大。理想情况下,我希望在这个阶段有一个组合器步骤来缩小混洗到缩减器的行数,但我没有找到可靠的方法。

这仅仅是手头任务的局限性,还是存在组织工作流的 Hadoop 技巧可以帮助我在第二步中减少数据洗牌?我担心洗牌大小在这种情况下是否合适?

谢谢!

最佳答案

根据您的产品集有多大(因此定义了可能的产品对的数量),您可以查看 map 端“本地”聚合。

在您的映射器中维护一个产品对到频率计数的映射,而不是将每个产品对和值 1 写入上下文,而是将它们累积在一个映射中。当映射达到预定义大小时,将映射刷新到输出上下文。您甚至可以使用 LRU 映射将最常观察到的对保留在映射中,并在它们被迫退出时写出那些“过期”条目。

有关适用于字数统计示例的示例,请参阅 http://www.wikidoop.com/wiki/Hadoop/MapReduce/Mapper#Map_Aggregation

当然,如果您有庞大的产品集或随机的产品配对,这不会为您节省那么多。您还需要了解在可用的 JVM 内存过期之前您的 map 可以达到多大。

您还可以考虑减少存储在输出键/值对象中的数据量:

  • 产品 ID 是整数吗(它们的值(value)是否相对较低 - 它们是否可以从写成 VIntWritable 而不是 IntWritable 中获益?)
  • 如果它们是整数,您是将产品对 key 写为串联 ID 的字符串表示形式,还是使用带有两个 int 字段的自定义 key (因此写入 4+4 字节而不是可能更大的数字,如果您使用字符串表示)
  • 您是否将值“1”作为 VIntWritable 写出?

关于 "customers who bought x also bought y"的 Hadoop 数据流效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9774049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com