我正在使用Pig的MultiStorage将输入文件拆分为许多较小的输出文件。

如果有帮助,脚本看起来像:

<snip registers and defines>
a = load '$FILES' using AvroStorage();
a_projected = foreach a generate field1, field2;
a_explode = foreach a_projected generate field1, FLATTEN(TOKENIZE(field2));

--splitting based on field2
store a_explode into '$OUTPUT' using org.apache.pig.piggybank.storage.MultiStorage('$OUTPUT','1');

这是从S3读取和写入。 “$ FILES”参数通常是一个文件夹,其中一个文件大约10,000行,大小约为2 MB。

使用MultiStorage时,这大约分为4-5千个单独的文件夹,其中有一个文件,大约需要15分钟才能运行。

使用PigStorage时,正如预期的那样,我得到一个输出文件,运行大约需要20秒。

MultiStorage可以提供这种性能吗?有什么可以改善的方法吗?

最佳答案

您的密钥空间可能太宽-在这种情况下,MultiStorage最终会创建多个文件,每个密钥一个。创建太多文件(内部MultiStorage为每个密钥创建一个Writer)需要大量时间。如果您不希望每个密钥都有文件,则应使用PigStorage。

09-26 11:38