我有一个简单的文本文件,其中包含一些FTP服务器上的文件夹列表。每一行都是一个单独的文件夹。每个文件夹包含几千个图像。我想连接到每个文件夹,将该文件夹中的所有文件存储在SequenceFile
中,然后从FTP服务器中删除该文件夹。我已经为此编写了一个简单的pig UDF。这是:
dirs = LOAD '/var/location.txt' USING PigStorage();
results = FOREACH dirs GENERATE download_whole_folder_into_single_sequence_file($0);
/* I don't need results bag. It is just a dummy bag */
问题是,我不确定每一行输入是否在单独的映射器中处理。输入文件不是一个很大的文件,只有几百行。如果它是纯Map/Reduce
,那么我将使用NLineInputFormat
并在单独的Mapper
中处理每一行。我怎样才能在猪身上达到同样的效果?
Pig允许您编写自己的加载函数,用于指定要使用的InputFormat。这样你就可以自己写了。
也就是说,你描述的工作听起来只需要一个地图缩减步骤。由于在这种情况下使用Pig不会降低复杂性,而且您必须编写自定义代码才能使用Pig,因此我建议只在vanilla-map-reduce中进行。如果总文件大小是千兆字节或更小,我会直接在一台主机上完成所有操作。如果不需要的话,不使用地图缩减会更简单。
我通常使用map reduce首先将数据加载到HDFS中,然后使用Pig进行所有数据处理。Pig在加载数据IMO方面并没有比普通的hadoop增加任何好处,它只是一个围绕InputFormat/RecordReader的包装器,带有您需要实现的其他方法。此外,从技术上讲,使用Pig可以多次调用您的加载器。这是一个你不需要担心直接使用Hadoop映射reduce的问题。