1

我有一个 Pig 作业,它分析日志文件并将摘要输出写入 S3。我不想将输出写入 S3,而是想将其转换为 JSON 有效负载并将其发布到 URL。

一些注意事项:

  • 此作业在 Amazon Elastic MapReduce 上运行。
  • 可以使用 STREAM 通过外部命令传输数据,然后从那里加载。但是因为 Pig 从不向外部命令发送 EOF,这意味着我需要在每一行到达时发布它,并且我不能对它们进行批处理。显然,这会损害性能。

解决这个问题的最佳方法是什么?PiggyBank 或其他库中是否有我可以使用的东西?或者我应该写一个新的存储适配器?感谢您的意见!

4

3 回答 3

4

您可以编写 UDF,而不是流式传输(因为 UDF确实提供了 finish() 回调)[1]

另一种方法可能是将 POST 作为数据的第二次传递。

  1. 您现有的猪步骤,它只是将单个关系作为 json 字符串写入
  2. 使用 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

于 2011-07-01T17:05:27.387 回答
1

也许您应该在 Pig 之外处理数据的发布。我发现将我的 Pig 包装在 bash 中通常比做一些 UDF 的帖子(没有双关语)处理步骤更容易。如果您不希望它达到 S3,您可以使用dump而不是store处理要发布的标准。否则,将其存储在 S3 中,将其拉出,hadoop fs -cat outputpath/part*然后将其发送出去curl

于 2011-07-03T02:13:20.857 回答
0

事实证明,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

如果这不起作用,请仔细检查以下内容:

  1. 您的脚本可以从命令行运行吗?
  2. 从 Pig 运行时,您的脚本是否具有所有必要的环境变量?
  3. 您的 EC2 引导操作是否正常工作?

其中一些很难验证,但如果其中任何一个失败,您很容易浪费大量时间进行调试。

但是请注意,您应该强烈考虑 mat kelcey 推荐的替代方法。

于 2011-07-21T11:28:45.017 回答