Hadoop流式Python多输入文件单映射器

Hadoop流式Python多输入文件单映射器,python,hadoop,mapreduce,cloudera,hadoop-streaming,Python,Hadoop,Mapreduce,Cloudera,Hadoop Streaming,我只有一个制图器 for line in sys.stdin: #if line is from file1 #process it based on some_arbitrary_logic #emit k,v #if line is from file2 #process it based on another_arbitrary_logic #emit k, v 我需要通过一个hadoop流式API调用这个映射器,其中包含-input f

我只有一个制图器

for line in sys.stdin:
    #if line is from file1
    #process it based on some_arbitrary_logic
    #emit k,v

    #if line is from file2
    #process it based on another_arbitrary_logic
    #emit k, v
我需要通过一个hadoop流式API调用这个映射器,其中包含
-input file1
和另一个
-input file2

我如何做到这一点?我如何知道hadoop streaming提供给我的
STDIN
中哪一行属于哪个文件

更新

File1

Fruit, Vendor, Cost

Oranges, FreshOrangesCompany, 50
Apples, FreshAppleCompany, 100

File2

Vendor, Location, NumberOfOffices

FreshAppleCompany, NewZealand, 45
FreshOrangeCompany, FijiIslands, 100
我需要做的是打印出他们在多少家办公室卖橘子

橙子100


因此,这两个文件都需要
INPUT
到映射器。

os.environ[“map.INPUT.file”]
在映射器内部,python代码应该给出映射器正在处理的块的文件名。

os.environ[“map.INPUT.file”]
在映射器内部,python代码应该给出映射器正在处理的块的文件名。

这个问题有点含糊不清,因为就文件的用途而言,没有提供太多细节。所以我做了一些假设

  • 如果file1和file2只是两组数据文件,并且具有相同类型的数据,那么您只需要确保文件得到处理。。。然后只需将文件复制到HDFS文件夹中,并确保该文件夹被标识为输入文件夹,并且您的状态良好。两个文件中的数据将用于调用映射程序

  • 如果文件1和文件2有不同的用途。例如,file1是mapper的输入文件,但file2是一些连接等需要参考的文件。然后是分布式缓存。检查这个

  • 如果file1和file2都是输入文件并且是相关的,那么您需要进行连接。如果文件1或文件2很小,则可以使用常规文件或归档文件将其用作分布式缓存。但是,如果两个文件都很大,那么就有点复杂了,因为您可能需要执行多个MR或将文件转换为配置单元可以使用的格式,然后使用配置单元联接,然后将联接结果作为Python映射器作业的输入


希望这能有所帮助。

这个问题有点含糊不清,因为就文件的用途而言,没有提供太多细节。所以我做了一些假设

  • 如果file1和file2只是两组数据文件,并且具有相同类型的数据,那么您只需要确保文件得到处理。。。然后只需将文件复制到HDFS文件夹中,并确保该文件夹被标识为输入文件夹,并且您的状态良好。两个文件中的数据将用于调用映射程序

  • 如果文件1和文件2有不同的用途。例如,file1是mapper的输入文件,但file2是一些连接等需要参考的文件。然后是分布式缓存。检查这个

  • 如果file1和file2都是输入文件并且是相关的,那么您需要进行连接。如果文件1或文件2很小,则可以使用常规文件或归档文件将其用作分布式缓存。但是,如果两个文件都很大,那么就有点复杂了,因为您可能需要执行多个MR或将文件转换为配置单元可以使用的格式,然后使用配置单元联接,然后将联接结果作为Python映射器作业的输入


希望这有帮助。

通过stdin传输的数据是比文件1和文件2更新的数据源吗?或者您想在文件1和文件2上运行mapreduce作业?@DonaldMiner看到了吗@DonaldMiner Hadoop streaming以标准格式为映射程序提供了它作为文件接收的内容,这就是这里的解释。您使用
-input
标志传递输入文件,而不是
-file
标志。
-file
标志用于参考数据文件或映射器代码本身。通过stdin传递的
-input
中的文件与仅将文件传送到本地工作目录的
-file
中的文件有很大区别。通过stdin传递的数据是比file1和file2新的数据源吗?或者您想在文件1和文件2上运行mapreduce作业?@DonaldMiner看到了吗@DonaldMiner Hadoop streaming以标准格式为映射程序提供了它作为文件接收的内容,这就是这里的解释。您使用
-input
标志传递输入文件,而不是
-file
标志。
-file
标志用于参考数据文件或映射器代码本身。通过stdin传递的
-input
中的文件与仅将文件传送到本地工作目录的
-file
中的文件之间存在很大差异。您知道这是在哪里记录的吗?我快速搜索了一下,没有找到任何官方的东西。我今天才知道。。。!谢谢签入UpdateJobWithPlit。它不在文档中,而是在Hadoop中——权威指南中。你知道在哪里有文档记录吗?我快速搜索了一下,没有找到任何官方的东西。我今天才知道。。。!谢谢签入UpdateJobWithPlit。它不在文档中,而是在Hadoop中——权威指南中。