Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Hadoop流媒体中使用TotalOrderPartitioner_Python_Hadoop - Fatal编程技术网

Python 在Hadoop流媒体中使用TotalOrderPartitioner

Python 在Hadoop流媒体中使用TotalOrderPartitioner,python,hadoop,Python,Hadoop,我正在使用python和Hadoop streaming来做一个项目,我需要Hadoop中TotalOrderPartitioner和InputSampler提供的类似功能,也就是说,我需要首先对数据进行采样并创建一个分区文件,然后使用分区文件来决定哪个K-V对将转到映射器中的哪个reducer。我需要在Hadoop 1.0.4中完成它 我只能找到一些带有KeyFieldBasedPartitioner和定制partitioner的Hadoop流示例,它们使用命令中的-partitioner选项

我正在使用python和Hadoop streaming来做一个项目,我需要Hadoop中TotalOrderPartitioner和InputSampler提供的类似功能,也就是说,我需要首先对数据进行采样并创建一个分区文件,然后使用分区文件来决定哪个K-V对将转到映射器中的哪个reducer。我需要在Hadoop 1.0.4中完成它


我只能找到一些带有KeyFieldBasedPartitioner和定制partitioner的Hadoop流示例,它们使用命令中的-partitioner选项来告诉Hadoop使用这些partitioner。我发现的使用TotalOrderPartitioner和InputSampler的示例都是Java的,它们需要使用InputSampler的writePartitionFile和DistributedCache类来完成这项工作。所以我想知道是否可以将TotalOrderPartitioner与hadoop流一起使用?如果可能,我如何组织代码来使用它?如果不是,那么首先在python中实现total partitioner然后使用它是否可行?

没有尝试,但以KeyFieldBasedPartitioner为例,简单地替换:

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

-partitioner org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner


应该可以工作。

在Hadoop流媒体中使用TotalOrderPartitioner的一种可能的方法是重新编码它的一小部分,以从环境变量中获取其分区文件的路径名,然后编译它,在系统上定义该环境变量,并将它的名称传递给流媒体作业,并使用中记录的-cmdenv选项

TotalOrderPartitioner的源代码位于。其中,getPartitionFile在两行上定义,从第143行开始,其第二行显示,如果未为其提供参数,它将使用默认的_路径作为分区文件名。默认路径在第54行定义为_partition.lst,第83行有一条注释,说明其假定位于DistributedCache中。基于此,在不修改getPartitionFile的情况下,应该可以使用_partition.lst作为分区文件名,只要它位于DistributedCache中

这就留下了运行InputSampler将内容写入分区文件的问题。我认为最好是运行一个已经编码好的Java MapReduce作业,该作业使用TotalOrderPartitioner,至少可以获得InputSampler输出的示例以确定其格式。如果可以修改示例作业以处理所需的数据类型,那么可以使用它创建一个分区文件,该文件可用于您的目的。使用TotalOrderPartitioner的两个编码MapReduce作业是和


另外,还有一个简单的自定义分区文件路径名硬编码为/partitions.lst,目录中提供了一个脚本sample.sh,该脚本使用hadoop、实时twitter提要和sample.py构建partition.lst。根据您的需要调整此系统应该相当容易,首先用您的数据样本替换twitter提要。

TotalOrderPartitioner需要一个分区文件来运行,否则它会抱怨该文件不存在,但我找不到在命令中指定此文件的方法。另外,我想使用InputSampler生成这个分区文件,但是我也找不到在命令中使用它的方法。