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

时间:2013-12-18 12:38:51

标签: 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

我需要通过带有-input file1和另一个-input file2的hadoop流式API来调用此映射器。

我如何实现这一目标?我怎么知道哪条线属于hadoop流媒体给我的STDIN中的哪个文件?

更新

File1

Fruit, Vendor, Cost

Oranges, FreshOrangesCompany, 50
Apples, FreshAppleCompany, 100

File2

Vendor, Location, NumberOfOffices

FreshAppleCompany, NewZealand, 45
FreshOrangeCompany, FijiIslands, 100

我需要做的是打印他们销售橙子的办公室数量。

Oranges 100

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

2 个答案:

答案 0 :(得分:4)

mapper python代码中的

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

答案 1 :(得分:1)

这个问题有点模棱两可,因为就文件的目的而言,没有提供太多细节。所以我做了一些假设

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

  • 如果是file1和file2有不同的目的。例如,file1是mapper的输入文件,但file2是你需要引用某些连接或等等的东西......然后是分布式缓存。请查看此Hadoop Streaming with multiple input

  • 如果file1和file2都是输入文件并且是相关的,则需要进行连接。如果file1或file2很小,那么您可以使用常规文件或归档文件将其用作分布式缓存。但是,如果两个文件都很大,那么它有点复杂,因为您可能需要执行多个MR或将文件转换为可由Hive使用的格式并使用hive连接然后使用连接结果作为输入到您的Python Mapper作业。

希望这有帮助。