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
我的问题是,在运行时间方面有更好的方法吗?
答案 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
,用于计算每个密钥的总体唯一编号。