【问题标题】:Syntax for Writing a Custom Partitioner in Hadoop在 Hadoop 中编写自定义分区器的语法
【发布时间】:2014-09-18 23:29:57
【问题描述】:

我了解自定义分区器背后的想法。就我而言,我想将所有相同的单词发送给一个减速器。我知道我可以使用哈希码来做到这一点。

但是,我不确定 Hadoop API 中分区器的语法。

这是签名:

Class Partitioner<KEY,VALUE> 

如何选择 Key、Value 类型?另外为什么我需要这里的价值?我不应该只使用密钥并根据某种逻辑返回一个整数(在我的例子中是哈希码)。

有人可以举个例子解释一下吗?

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    默认分区器(HashPartitioner)的语法如下

    公共类 HashPartitioner 扩展 Partitioner { public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } }

    Key 必须是 WritableComparable 类型,因为框架必须根据 key 执行排序,而 value 可以是任何 Writable 类型,以便框架可以序列化和反序列化它们。

    现在,当您询问值类型的要求时,让我们举一个 MovieLense 案例研究的示例,其中一个名为 ratings.dat 的文件具有

    形式的数据userID::movieID::ratings::timestamp
    在此评级中,用户对电影的评级范围为 1-5
    现在假设 userID 是键,其他在值部分。现在假设您的要求是 reducer 的输出文件应该代表评级,比如一个包含评级 1 的所有记录的文件,另一个包含评级 2 的记录,依此类推。因此,您的输出将总共有 5 个代表评级的文件。

    所以现在在 partitioner 中,您可以根据包含在 value 部分中的 rating 来决定将记录发送到哪个 reducer,例如如果 rating 等于 1 则返回 0,如果 2 则返回 1 等等。 所以代码将如下所示

    公共类 MoviePartitioner 扩展 Partitioner{ @覆盖 公共 int getPartition(LongWritable userId,电影值,int arg2){ int rating = Integer.parseInt(value.getMovieRating()); 回报率 - 1; // 因为评分从 1 开始 } }

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2011-12-23
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多