6

我们的工作流程使用 AWS elastic map reduce 集群来运行一系列 Pig 作业,以将大量数据处理成聚合报告。不幸的是,输入数据可能不一致,并且可能导致没有输入文件或 0 字节文件被提供给管道,甚至由管道的某些阶段生成。

在 LOAD 语句期间,如果 Pig 没有找到任何输入文件或任何输入文件为 0 字节,它就会失败。

有什么好的方法可以解决这个问题(希望在 Pig 配置或脚本或 Hadoop 集群配置中,无需编写自定义加载器......)?

(因为我们使用的是 AWS elastic map reduce,所以我们只能使用 Pig 0.6.0 和 Hadoop 0.20。)

4

2 回答 2

1

我一直在使用的方法是从 shell 运行 pig 脚本。我有一项从六个不同输入目录获取数据的工作。所以我为每个输入文件编写了一个片段。

shell 检查输入文件是否存在,并从片段中组装出最终的 pig 脚本。

然后它执行最终的 pig 脚本。我知道这有点像 Rube Goldberg 的方法,但到目前为止还不错。:-)

于 2015-01-26T15:32:31.303 回答
1

(对于后代,我们提出了一个低于标准的解决方案:)

为了处理 0 字节问题,我们发现我们可以检测到这种情况,而是插入一个带有单个换行符的文件。这会导致如下消息:

Encountered Warning ACCESSING_NON_EXISTENT_FIELD 13 time(s).

但至少 Pig 不会因异常而崩溃。

或者,我们可以为该文件生成一个包含适当数量'\t'字符的行,这样可以避免警告,但它会将垃圾插入到我们必须过滤掉的数据中。

这些相同的想法可用于通过创建一个虚拟文件来解决无输入文件的情况,但它具有与上面列出的相同的缺点。

于 2011-04-20T23:23:55.963 回答