您如何处理 Apache Pig 中的空输入文件或丢失的输入文件?
Posted
技术标签:
【中文标题】您如何处理 Apache Pig 中的空输入文件或丢失的输入文件?【英文标题】:How do you deal with empty or missing input files in Apache Pig? 【发布时间】:2011-04-20 23:20:31 【问题描述】:我们的工作流程使用 AWS elastic map reduce 集群来运行一系列 Pig 作业,以将大量数据处理成聚合报告。不幸的是,输入数据可能不一致,并可能导致没有输入文件或 0 字节文件被提供给管道,甚至由管道的某些阶段生成。
在 LOAD 语句期间,如果 Pig 没有找到任何输入文件或任何输入文件为 0 字节,Pig 就会失败。
有什么好的方法可以解决这个问题(希望在 Pig 配置或脚本或 Hadoop 集群配置中,无需编写自定义加载程序...)?
(因为我们使用的是 AWS elastic map reduce,所以我们只能使用 Pig 0.6.0 和 Hadoop 0.20。)
【问题讨论】:
因为这样的问题,我停止使用 Pig。在 0.6.0 中编写自定义加载器也几乎是不可能的(他们在 0.8.0 中改进了加载器 API)。考虑使用 Hive。 【参考方案1】:(为了后代,我们提出了一个低于标准的解决方案:)
为了处理 0 字节问题,我们发现我们可以检测到这种情况,然后插入一个带有单个换行符的文件。这会导致如下消息:
Encountered Warning ACCESSING_NON_EXISTENT_FIELD 13 time(s).
但至少 Pig 不会因异常而崩溃。
或者,我们可以为该文件生成一行包含适当数量的'\t'
字符的行,这样可以避免警告,但它会将垃圾插入到我们必须过滤掉的数据中。
这些相同的想法可用于通过创建一个虚拟文件来解决无输入文件的情况,但它具有与上面列出的相同的缺点。
【讨论】:
【参考方案2】:我一直使用的方法是从 shell 运行 pig 脚本。我有一项从六个不同输入目录获取数据的工作。所以我为每个输入文件编写了一个片段。
shell 检查输入文件是否存在,并从片段中组装出最终的 pig 脚本。
然后它执行最终的 pig 脚本。我知道这有点像 Rube Goldberg 的方法,但到目前为止还不错。 :-)
【讨论】:
以上是关于您如何处理 Apache Pig 中的空输入文件或丢失的输入文件?的主要内容,如果未能解决你的问题,请参考以下文章