Python hadoop中拆分和映射任务的数量

Python hadoop中拆分和映射任务的数量,python,hadoop,mapreduce,hadoop-streaming,hadoop2,Python,Hadoop,Mapreduce,Hadoop Streaming,Hadoop2,我是Map Reduce编程新手,我已经用python编写了我的算法,我需要在“n”数据集上运行同一程序(我的算法)的“n”映射实例。因为我的代码是用python编写的,所以我在代码中使用hadoopstreaming Hadoopstreaming文档在这里建议-,“生成一个包含输入文件完整HDFS路径的文件。每个映射任务将获得一个文件名作为输入。” 因此,我为每个数据集文件创建了一个带有路径的文本文件。为了测试,我从这个-,写了字数计算程序。在我的map函数中,在进行实际的字数统计之前,我已

我是Map Reduce编程新手,我已经用python编写了我的算法,我需要在“n”数据集上运行同一程序(我的算法)的“n”映射实例。因为我的代码是用python编写的,所以我在代码中使用hadoopstreaming

Hadoopstreaming文档在这里建议-,“生成一个包含输入文件完整HDFS路径的文件。每个映射任务将获得一个文件名作为输入。”

因此,我为每个数据集文件创建了一个带有路径的文本文件。为了测试,我从这个-,写了字数计算程序。在我的map函数中,在进行实际的字数统计之前,我已经编写了下面的代码

for line in sys.stdin:
    # obtain filename from file list
    filename = line.rstrip('\n')
    localfilename = ntpath.basename(filename)
    os.environ("hadoop dfs -get"+line+ " " + localfilename)
问题1。因此,我的理解是,每一行都将作为一个分割给我的map函数,因此分割数应该是主文件中的分割数或行数。我的主文件中有三个文件名,但我可以看到创建了两个拆分。为什么会这样

问题2。我的工作失败了,我不知道为什么,在哪里检查这些日志文件

第三季度。除此之外,我还有另一个选项来处理我的需求,将所有三个数据集放在一个文件中,并用特定的分隔符将其分隔,然后可以设置conf.set(“textinputformat.record.delimiter”,“specific delimiter”),但问题是它必须用java完成。此外,在许多论坛中,编写自定义记录阅读器也是为了实现这一点。因为我不擅长java,所以我正在用python编写我的实现,到底是要设置这个参数,还是不用编写java代码就可以实现

第四季度。在hadoop中有没有其他我没有的选项来处理我的需求


Q1:Hadoop将根据需要拆分每个文件,并且无法保证哪行可以放在哪里。您需要将行放入单独的文件中,以确保它们由单独的映射程序处理

例如,如果您有三个文件名,而不是将它们全部放在一个
/TEMP/files
文件中,您应该在一个子文件夹中创建三个文件,每个文件都有一个文件名,然后像这样将它们添加到作业中:
-input/TEMP/files/*
。这会给你你想要的行为

请注意,您不会获得数据的任何位置。获取第一个文件引用的映射器可能需要从另一个节点获取它。根据集群的大小,对于正在处理的大多数文件,您可能更需要访问网络

Q2:命令行输出只告诉您java容器故障,而不是python的实际错误。要获得该信息,您应该转到“工作跟踪器”页面:
http://localhost:50030/jobtracker.jsp

从那里你可以在“失败的工作”下找到你的工作。在该页面上单击失败的任务,并在“任务日志”列中选择一个选项。从那里您将看到python脚本的stderr输出

您正在使用os.environ执行一些奇怪的操作。您应该使用子流程来执行命令。例如:

from subprocess import call
call(["/usr/bin/hadoop", "dfs", "-get", line, localfilename])
Q3:我不确定这里的要求是什么。你是说上面的文件引用的实际文件,然后你将直接通过-进入你的地图?您正在手动处理它们,因此它们的格式无关紧要,因为它们没有被传递到map/reduce中


Q4:看起来您有一些文件需要并行处理,但不需要使用map/reduce。基本上,您只想利用一个事实,即您有一个可用的hadoop集群和一堆cpu。这很好,可以工作,但除了将工作转移到从属对象之外,您并没有真正使用hadoop。谢谢你的回复。是的,那是错的,我刚刚纠正了它。除了第一个答案之外,您还提到,通过提供-input/TEMP/files/*将提供我想要的行为。那么,在这种情况下,这是否满足了我对每个map任务处理一个文件的要求。因为我的数据不应该混合,因为我正在做一些函数依赖性的事情,混合数据集将完全影响我的需求。是的,我相信两个不同的文件不会发送到同一个映射器。我想知道,为什么这很重要?你可以独立处理我们输入的每个文件,即使它们是由同一个映射器处理的。因为,我将在映射函数上编写我的算法,该函数将比较该数据集中的每个元组,因此如果其他数据集与之混合,则会出现完全混乱的情况。在我的问题3中,我说,将我的所有数据复制到一个文件中,并在每个数据集数据后添加一些delimeter,然后使用这种方法,这样,直到一个分隔符的数据都将由单个映射任务读取,但java中提到了这一点,我在python中寻找类似的东西-这个解决方案似乎也是一个不错的解决方案。我创建了三个文件,并将所有三个文件都放在这个文件中-input/TEMP/files/*中,然后单独执行map来打印数据,正如您所说,创建了三个拆分和三个map任务,并打印了所有map中的所有数据。有没有办法查看哪些数据来自哪个映射器?像地图id或计数器id之类的?如果不是,如何迭代自定义数字作为每个映射任务的键,例如映射任务1使用键1输出记录,映射任务2使用键2输出记录,等等。。这是为了确保文件2中的数据不会在map1任务中混合。
from subprocess import call
call(["/usr/bin/hadoop", "dfs", "-get", line, localfilename])