1

我正在使用 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,000 个单独的文件夹,其中包含一个文件,运行大约需要 15 分钟。

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

MultiStorage 会有这种性能吗?有什么可以改进的吗?

4

1 回答 1

0

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

于 2014-10-29T01:17:34.093 回答