我正在使用带有Hadoop流的python做项目,我需要Hadoop中TotalOrderPartitioner
和InputSampler
提供的类似功能,也就是说,我需要先对数据进行采样,创建一个分区文件,然后使用分区文件来决定哪个KV对将转到mapper中的哪个reducer。我需要在Hadoop 1.0.4中完成。
我只能找到一些带有KeyFieldBasedPartitioner
和自定义分区程序的Hadoop流示例,它们使用命令中的-partitioner
选项告诉Hadoop使用这些分区程序。我使用TotalOrderPartitioner
和InputSampler
找到的示例全部使用Java,他们需要使用writePartitionFile()
InputSampler
和DistributedCache
类来完成工作。所以我想知道是否可以将TotalOrderPartitioner
用于hadoop流媒体?如果可能,我如何组织我的代码才能使用它?如果不是,那么首先在python中实现整个分区器然后使用它是否切实可行?
答案 0 :(得分:0)
没试过,但是以KeyFieldBasedPartitioner为例,只需替换:
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
带
-partitioner org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner
应该工作。
答案 1 :(得分:0)
在Hadoop流中使用TotalOrderPartitioner的一种可能方法是重新编码它的一小部分,从环境变量中获取其分区文件的路径名,然后编译它,在系统上定义该环境变量并将其名称传递给流使用-cmdenv选项的作业(记录在https://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html#Streaming_Command_Options。
TotalOrderPartitioner的源代码可在TotalOrderPartitioner.java获得。在其中,getPartitionFile()在第143行开始的两行上定义,第二行显示如果没有给出参数,则使用DEFAULT_PATH作为分区文件名。 DEFAULT_PATH在第54行定义为" _partition.lst"第83行有一条注释,表示它假定在DistributedCache中。基于此,不修改getPartitionFile(),应该可以使用_partition.lst作为分区文件名,只要它在DistributedCache中。
这就产生了运行InputSampler以将内容写入分区文件的问题。我认为最好通过运行使用TotalOrderPartitioner的已编码的Java MapReduce作业来完成,至少要获得InputSampler输出的示例以确定其格式。如果可以更改示例作业以处理所需的数据类型,则可以使用它来创建可用于您的目的的分区文件。使用TotalOrderPartitioner的几个编码的MapReduce作业是TotalOrderSorting.java和TotalSortMapReduce.java。
或者在twittomatic处有一个简单的自定义IntervalPartitioner.java,其中分区文件路径名被硬编码为/partitions.lst,并在sorter目录中提供了一个脚本示例。 sh,使用hadoop,一个实时的twitter feed和sample.py构建partition.lst。根据您的需求调整此系统应该相当容易,首先用您的数据样本替换twitter Feed。