mapreduce - 如何匿名列的值

时间:2013-07-20 11:54:22

标签: mapreduce

输入

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 ..)替换“keys”,并用新键取消组合值并再次写入文件,如下所示

输出文件

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

我的问题是,在运行时间方面有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

没有方式这是MapReduce作业的瓶颈。更确切地说,作业的运行时间由其他问题(网络和磁盘I / O等)决定。一个快速的小键功能? MEH。

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

事实上,假装您的随机密钥空间只有一分钟有365个可能的值。事实证明,如果你生成一个仅仅 23个随机密钥,你就更有可能发生密钥冲突;欢迎来到birthday paradox。突然之间,当你开始粉碎记录时,你已经失去了对键的全部意义,因为给两个不应该使用相同键的同一个键!

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

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

在您的情况下,您需要在输入密钥空间中使用injective的函数(即,如果f(x) != f(y),则保证x != y。你还没有给我足够的细节来提出具体的建议,但那就是你要找的东西。

严肃地说,有 no 方式,这个功能的性能将成为一个问题。你的工作的运行时确实会被其他问题完全支配

编辑:

回复您的comment

  

这里我实际上是想让日志文件中的ip号匿名,所以如果你认为有更好的方式我会很高兴知道。

首先,我们在这里有一个严重的 XY problem。您应该向搜索询问 问题的答案。匿名化IP地址或其他任何内容都是 hard 。您甚至没有告诉我们“解决方案”的标准(例如,谁是攻击者?)。我建议您在answer网站上查看此IT Security Stack Exchange

答案 1 :(得分:0)

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

  

Context.getTaskAttemptID()。getTaskID()。的getId()

获取unique reducer number,用于计算每个密钥的总体唯一编号。