使用KeyFieldBasedPartitioner进行hadoop文件拆分

时间:2013-06-25 21:48:29

标签: hadoop mapreduce hadoop-streaming hadoop-partitioning

我有一个格式如下的大文件

sample name \t index \t score

我正在尝试使用Hadoop Streaming根据示例名称拆分此文件。 我提前知道有多少样品,所以可以指定我需要多少个减速器。 这个post做的非常相似,所以我知道这是可能的。

我尝试使用以下脚本将此文件拆分为16个文件(有16个样本)

hadoop jar $STREAMING \
    -D mapred.text.key.partitioner.options=-k1,1 \
    -D stream.num.map.output.key.fields=2 \
    -D mapred.reduce.tasks=16 \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
    -mapper cat \
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
    -input input_dir/*part* -output output_dir

这有点奏效 - 有些文件只包含一个样本名称。但是大部分*文件都是空白的,部分*文件包含多个样本名称。

有没有更好的方法来确保每个reducer只获得一个样本名称?

1 个答案:

答案 0 :(得分:2)

仅供参考,实际上有一种更简洁的方法可以使用自定义的OutputFormat

来分割文件

这个link描述了如何做得很好。我最终为我的具体应用定制了另一个link。总而言之,它只有几行额外的Java