将 Hadoop Pig 输出作为 JSON 数据发布到 URL?
Posted
技术标签:
【中文标题】将 Hadoop Pig 输出作为 JSON 数据发布到 URL?【英文标题】:POST Hadoop Pig output to a URL as JSON data? 【发布时间】:2011-06-28 11:50:44 【问题描述】:我有一个 Pig 作业,它分析日志文件并将摘要输出写入 S3。我不想将输出写入 S3,而是将其转换为 JSON 有效负载并将其发布到 URL。
一些注意事项:
此作业正在 Amazon Elastic MapReduce 上运行。 我可以使用 STREAM 通过外部命令传输数据,然后从那里加载。但是因为 Pig 从不向外部命令发送 EOF,这意味着我需要在每一行到达时对其进行 POST,并且我不能对它们进行批处理。显然,这会损害性能。解决此问题的最佳方法是什么? PiggyBank 或其他库中是否有我可以使用的东西?或者我应该写一个新的存储适配器?谢谢你的建议!
【问题讨论】:
事实证明,Pig 确实 发送 EOF。请参阅下面接受的答案。 【参考方案1】:您可以编写 UDF 而不是流式传输(因为 UDF 的 do 提供了一个 finish() 回调)[1]
另一种方法是将 POST 作为数据的第二次传递。
-
您现有的 pig 步骤,它只是将单个关系作为 json 字符串写出
使用 NLineInputFormat 批量执行 POST 的简单流式作业
我总是喜欢这种方法,因为它可以分离关注点并使猪代码干净。
它还允许您(在我看来)在工作的 POST 部分使用更简单的调整选项。在这种情况下,根据接收 Web 服务的幂等性,关闭推测执行对您来说(可能)很重要。请注意,运行 大量 并发作业的集群也可能完全杀死服务器:D
例如分批发布 20 个...
$ hadoop jar ~/contrib/streaming/hadoop-streaming.jar \ -D mapred.line.input.format.linespermap=20 \ -D mapred.reduce.tasks.speculative.execution=false \ -输入 json_data_to_be_posted -输出输出 \ -mapper your_posting_script_here.sh \ -numReduceTasks 0 \ -inputformat org.apache.hadoop.mapred.lib.NLineInputFormat[1]http://pig.apache.org/docs/r0.7.0/api/org/apache/pig/EvalFunc.html#finish%28%29
【讨论】:
【参考方案2】:也许您应该在 Pig 之外处理数据的发布。我发现将我的 Pig 包装在 bash 中通常比做一些 UDF 的帖子(没有双关语)处理步骤更容易。如果您不想让它命中 S3,您可以使用 dump
而不是 store
并处理要发布的标准。否则,将其存储在 S3 中,使用 hadoop fs -cat outputpath/part*
将其拉出,然后使用 curl
或其他方式将其发送出去。
【讨论】:
【参考方案3】:事实证明,Pig 确实正确地将 EOF 发送到外部命令,因此您可以选择通过外部脚本流式传输所有内容。如果它不起作用,那么您可能遇到了难以调试的配置问题。
以下是如何开始。使用您需要的任何解释器和脚本定义如下外部命令:
DEFINE UPLOAD_RESULTS `env GEM_PATH=/usr/lib/ruby/gems/1.9.0 ruby1.9 /home/hadoop/upload_results.rb`;
通过您的脚本流式传输结果:
/* Write our results to our Ruby script for uploading. We add
a trailing bogus DUMP to make sure something actually gets run. */
empty = STREAM results THROUGH UPLOAD_RESULTS;
DUMP empty;
在 Ruby 中,您可以将输入记录批处理成 1024 个块:
STDIN.each_line.each_slice(1024) do |chunk|
# 'chunk' is an array of 1024 lines, each consisting of tab-separated
# fields followed by a newline.
end
如果这不起作用,请仔细检查以下内容:
-
您的脚本是否可以从命令行运行?
从 Pig 运行时,您的脚本是否具有所有必要的环境变量?
您的 EC2 引导操作是否正常工作?
其中一些很难验证,但如果其中任何一个失败,您很容易浪费大量时间进行调试。
但是请注意,您应该强烈考虑 mat kelcey 推荐的替代方法。
【讨论】:
以上是关于将 Hadoop Pig 输出作为 JSON 数据发布到 URL?的主要内容,如果未能解决你的问题,请参考以下文章