显示结果中的 Pig Udf

Posted

技术标签:

【中文标题】显示结果中的 Pig Udf【英文标题】:Pig Udf in displaying result 【发布时间】:2014-07-17 05:08:51 【问题描述】:

我是 pig 新手,我用 java 写了一个 udf,我已经包含了一个

System.out.println

声明。我必须知道在 pig 中运行时这条语句的打印位置。

【问题讨论】:

【参考方案1】:

假设您的 UDF 扩展了 EvalFunc,您可以使用从 EvalFunc.getLogger() 返回的 Logger。日志输出应该在 pig 执行的关联 Map / Reduce 任务中可见(如果作业在多个阶段执行,那么您必须通过它们来查找关联的日志条目)。

日志最终会出现在 Map Reduce Task 日志文件中。我建议在部署到集群之前在本地模式下调试你的 UDF,这样你就可以从 Eclipse 等 IDE 中调试它。

默认情况下,错误(例如:脚本解析错误)会记录到 pig.logfile,可以在 $PIG_HOME/conf/pig.properties 中设置。如果您也想记录状态消息,请准备一个有效的 log4j.properties 文件并将其设置在 log4jconf 属性中。

使用 Pig v0.10.0 (r1328203) 时,我发现成功的 pig 任务不会将作业的历史日志写入 hdfs 上的输出目录。 (hadoop.job.history.user.location=$mapred.output.dir/_logs/history/)

如果您想通过各种方式获取这些历史记录,请以这种方式在您的猪脚本中设置 mapred.output.dir:

设置 mapred.output.dir '/user/hadoop/test/output';

注意: Pig 使用 apache 的 log4j 模块进行日志记录。但是,弄清楚为什么您不能使用 log4j 将是令人生畏的。带有 pig 的属性,因为有时您可能会使用自定义根记录器获得 NPE。

Pig 有一个命令行选项 -4(是的,它不像 log4j 那样直观)与 log4j 一起使用。

这里是示例 log4j.properties 示例的用法示例。

选项-l用于命名日志文件

pig -l /tmp/some.pig.log -4 log4j.properties -x local mysample.pig(脚本)

cat log4j.properties

# Root logger option
log4j.rootLogger=INFO, file, F
# Direct log messages to a log file
log4j.logger.org.apache.pig=DEBUG
log4j.logger.org.apache.hadoop=INFO
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=$pig.logfile
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%dABSOLUTE %5p %c1:%L - %m%n
log4j.appender.file.layout.ConversionPattern=%dABSOLUTE %5p [%t] (%F:%L) - %m%n

#another example line below for a different format of output log line
# log4j.appender.file.layout.ConversionPattern="%d [%t] %-5p %c - %m%n"

上述 pig 命令的输出以典型的 apache log4j 格式存储在文件 /tmp/some.pig.log 中。

请查看 apache log4j 文档,了解不同的 Appender、Console 及其在日志中各自的格式输出。或者,如果您正在寻找特定格式或重定向选项,请告诉我。

【讨论】:

【参考方案2】:

如果您在单台机器上运行 pig 说您的本地计算机,那么 System.out.println 日志将全部显示在终端上打印的所有内容但是如果 pig 脚本在集群上运行,那么您将看不到打印消息。怪诞……嗯……

如果您认为每个任务都在单独的机器上运行更深入一点,因此打印消息存在于集群上的单独机器上,因此您不会在您的机器上看到它。

现在有什么解决办法,这个过程有点繁琐,请耐心等待。

The url to track the job: http://ip-172-31-29-193.us-west-2.compute.internal:20888/proxy/application_1443585172695_0019/

在浏览器中打开它,当你尝试打开它时,它会因为ip是本地的而无法打开。假设您正在使用 EMR 集群,然后将其公开 在我的情况下是

Master public DNS:ec2-52-89-98-140.us-west-2.compute.amazonaws.com

现在把上面url中的公网ip替换成

ec2-52-89-98-140.us-west-2.compute.amazonaws.com:20888/proxy/application_1443585172695_0019/

执行完之后你会发现url变了

一些私有IP然后是工作历史服务器

http://ip-172-31-29-193.us-west-2.compute.internal:19888/jobhistory/job/job_1443585172695_0019/

再次替换私有ip

ec2-52-89-98-140.us-west-2.compute.amazonaws.com:19888/jobhistory/job/job_1443585172695_0019/

现在你应该来到这个页面

现在确定您的任务(调用 UDF 的点)是在 mapper 还是 reducer 阶段(groupby 之前或之后)执行并点击链接

现在转到日志所在的终端。并找到计算变量的步骤并从那里获取jobid

我的jobid是job_1443585172695_0021

现在,在上一步中,假设您的变量位于减少阶段,单击该变量,您将获得类似于 的屏幕。从那里获取私有 IP,在我的情况下是 172-31-28-99

现在转到 EMR 页面

点击硬件实例并点击查看 EC2 实例

你会得到类似的东西

。现在获取与私有IP对应的公共IP,在我的例子中是52.25.196.219

现在打开网址 publicip:8042

52.25.196.219:8042 获得类似于 的内容。单击左侧的工具,然后单击本地日志。

差不多就在那里等一会儿。

现在导航会得到另一个页面

单击容器 --> 您的工作 ID(我们在图 2 中找到)(在我的情况下,它是 application_1443585172695_0021/ 4096 字节 2015 年 9 月 30 日上午 5:28:53)---> 然后会有很多以 container 为前缀的文件,打开一个,你会发现 stdout 目录打开它可以看到 system.out.println 消息。

嗯,这里有你的日志。呸。那是一件很麻烦的工作。做几次,你就会成为专业人士。

要记住的几件事 1)在本地机器上测试UDF 2) 学习单元测试用例对调试有很大帮助

以上两件事将省去查找日志的所有麻烦

有一种方法可以找到实际的集装箱号但是我忘记了,如果有人知道请告诉我。

PS:对不起,如果答案太长。想好好解释一下,请原谅我的英文。

【讨论】:

【参考方案3】:

如果您在 pig 脚本中注册并使用此 UDF,然后输出将存储在猪日志文件中,例如 stdoutlogs。

【讨论】:

@Rengasamy...我问我是否使用了任何 println 语句,猪会在哪里显示它.. 是的,你可以在pig中使用print语句,可以在pig日志中查看@user3797438

以上是关于显示结果中的 Pig Udf的主要内容,如果未能解决你的问题,请参考以下文章

Pig 中的 Python UDF

Pig如何实例化UDF对象

如何使用 PIG 将 Avro 格式存储在 HDFS 中?

Pig 中的 SimpleTextLoader UDF

PIG 中 UDF 中的 java.lang.NullPointerException

如何从 Pig 中的 Python UDF 打印?