1

输入

1 - -  GET hm_brdr.gif 
2 - -  GET s102382.gif                ( "1", {"- -  GET hm_brdr.gif"})
3 - -  GET bg_stars.gif  map-reduce-> ( "2", {"- -  GET s102382.gif"}) 
3 - -  GET phrase.gif                 ( "3", {"- -  GET bg_stars.gif,"- -  GET phrase.gif"}) 

我想使用随机整数将第一列值设为 1,2,3.. 匿名。但它不应该像一行中的 1->x 和另一行中的 1->t 那样改变它。所以我的解决方案是在 reduce 步骤中用随机整数 (rand(1)=x, rand(2)=y ..) 替换“键”,并用它们的新键取消组合值并再次写入文件,如下所示.

输出文件

x - -  GET hm_brdr.gif 
y - -  GET s102382.gif       
z - -  GET bg_stars.gif    
z - -  GET phrase.gif 

我的问题是,在运行时间方面有没有更好的方法来做到这一点?

4

2 回答 2

0

如果您想为键值分配一个随机整数,那么您必须在减速器中执行此操作,key/value pairs该键的所有内容都集中在一个地方。正如@jason指出的那样,您不想分配随机数,因为不能保证不会为两个不同的键选择特定的随机数。您可以做的只是增加一个作为实例变量保存在 reducer 上的计数器,以获取下一个与键关联的可用数字。如果您有少量数据,则可以使用单个 reducer,并且数字将是唯一的。如果您被迫使用多个减速器,那么您将需要一种稍微复杂的技术。利用

Context.getTaskAttemptID().getTaskID().getId()

得到一个unique reducer number用于计算每个键的整体唯一编号。

于 2013-07-20T17:47:46.877 回答
0

绝不会成为 MapReduce 作业的瓶颈。更准确地说,您的工作的运行时间由其他问题(网络和磁盘 I/O 等)支配。一个快速的小键功能?嗯。

但这甚至不是您提案的最大问题。你的提议最大的问题是它注定要失败。关于钥匙的关键事实是什么?它们用作记录的唯一标识符。随机数生成器是否保证唯一性?没有

事实上,假装你的随机密钥空间有 365 个可能的值。事实证明,如果您生成23 个随机密钥,则更有可能发生密钥冲突;欢迎来到生日悖论。突然之间,你一开始就失去了钥匙的全部意义,因为你开始通过给两个不应该有相同钥匙的相同钥匙来打破记录!

你可能会想,好吧,我的密钥空间不像 365 个可能的键那么小,它更像是 2^32 个可能的键,所以我完全清楚没有。在大约 77,000 个键之后,您更有可能发生碰撞。

你的想法完全站不住脚,因为它是工作的错误工具。您需要唯一的标识符。随机不保证唯一性。获取不同的工具。

在您的情况下,您需要一个在输入键空间上单的函数(也就是说,它保证f(x) != f(y)if x != y)。你没有给我足够的细节来提出任何具体的建议,但这就是你要找的。

严重的是,此功能的性能绝不会成为问题。你的工作的运行时间真的会完全被其他问题所支配。

编辑:

回复您的评论

在这里,我实际上是在尝试使日志文件中的 ip 号码匿名,所以如果您认为有更好的方法,我会很高兴知道。

首先,我们这里有一个严重的 XY 问题。您应该要求搜索问题的答案。匿名 IP 地址或任何与此相关的事情都很难。您甚至没有告诉我们“解决方案”的标准(例如,谁是攻击者?)。我建议在IT Security Stack Exchange网站上查看此答案。

于 2013-07-20T16:58:39.870 回答