2013-12-18 47 views
0

我有一个映射器。Hadoop流式Python多输入文件单映射器

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

我该如何做到这一点?我怎么知道哪一行属于STDIN hadoop streaming给我的文件?

UPDATE

File1 

Fruit, Vendor, Cost 

Oranges, FreshOrangesCompany, 50 
Apples, FreshAppleCompany, 100 

File2 

Vendor, Location, NumberOfOffices 

FreshAppleCompany, NewZealand, 45 
FreshOrangeCompany, FijiIslands, 100 

我需要做的是在多少办公室做他们卖橘子打印出来。

Oranges 100

所以这两个文件都需要为INPUT给映射器。

+0

来自stdin的数据是比file1和file2更新的数据源吗?或者你想通过file1和file2运行你的mapreduce作业吗? –

+0

@DonaldMiner看到这个http://stackoverflow.com/a/4839045/2358206 – ComputerFellow

+0

@DonaldMiner Hadoop流为映射器提供了stdin作为文件接收的东西,这就是http://stackoverflow.com/users/37751/jd-长在那里解释。 – ComputerFellow

回答

4

os.environ["map.input.file"]里面的映射器python代码应该给出映射器正在处理的块的文件名。

+1

你知道这是记录在哪里吗?我做了一个快速搜索,找不到任何官方的东西。我今天才知道...!谢谢! –

+0

查看[here]中的updateJobWithSplit(http://svn.apache.org/repos/asf/hadoop/common/tags/release-1.0。4/SRC/mapred /组织/阿帕奇/ hadoop的/ mapred/MapTask.java)。这不在文档中,而是在Hadoop - 权威指南中。 –

1

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

  • 如果file1和file2的只是两组数据文件,并具有相同的数据类型和所有你需要确保的是,文件处理...然后只要复制将文件保存到HDFS文件夹并确保该文件夹被识别为输入文件夹,并且您很好。来自两个文件的数据将被用于调用映射器...

  • 如果是file1和file2有不同的用途。例如,file1是映射器的输入文件,但file2是您需要参考的某些连接或其他内容,然后是分布式缓存。请检查此Hadoop Streaming with multiple input

  • 如果file1和file2都是输入文件并且都是相关的并且您需要进行连接。如果file1或file2很小,则可以使用常规文件或存档文件将其用作分布式缓存。但是,如果这两个文件都很大,那么它会稍微复杂一些,因为您可能必须执行多个MR或将文件转换为可供Hive使用的格式,然后使用配置单元连接,然后使用连接结果作为输入到您的Python Mapper作业。

希望这会有所帮助。

+0

请检查更新。 – ComputerFellow

相关问题